0

概要ページで 5 つの異なるクエリを実行して、サイトに掲載されているニュース記事の数などの基本データを表示しています。次のようなクエリを使用しています。

$sql4 = "SELECT `ride_id` FROM `tpf_rides` WHERE `type` LIKE '%Roller Coaster%'" ;
$result4 = $pdo->query($sql4);
$coasters = $result4->rowCount();

しかし、もっと効率的な方法があるのだろうか。ID のみをプルすることで負荷を最小限に抑えようとしましたが、必要なのはカウントだけなので、負荷をさらに軽減できますか?

また、これらのクエリは、ページが読み込まれるたびに実行する必要はなく、実際には 1 日に 1 回か 2 回実行するだけで済みます。誰かがこれを設定する方向に私を向けることができますか? 私はこれまでこれを行う必要はありませんでした。ありがとう。

4

2 に答える 2

5

はい、もっと効率的な方法があります。データベースにカウントを任せます。

SELECT count(*) as cnt
FROM `tpf_rides`
WHERE `type` LIKE '%Roller Coaster%';

探しているすべてのカウントがtpf_ridesテーブルからのものである場合は、1 つのクエリでそれらを実行できます。

SELECT sum(`type` LIKE '%Roller Coaster%') as RollerCoaster,
       sum(`type` LIKE '%Haunted House%') as HauntedHouse,
       sum(`type` LIKE '%Ferris Wheel%') as FerrisWheel
FROM `tpf_rides`;

これは、3 つの異なるクエリを実行するよりもさらに高速です。

于 2013-08-08T00:26:48.220 に答える
1

これらのクエリを時々実行したい場合は、結果をどこかに保存しておく必要があります。これは、自分で管理する事前に計算された合計または単純なキャッシュの形を取ることができます。以下は、Linux で確実に動作する非常に単純で素朴なキャッシュの実装です。ここで改善できることはたくさんありますが、これで何ができるかがわかります。以下は、複数のカウントを返す Gordon Linoff によって提案されたクエリと互換性がありません。

コードはテストされていません。

$cache_directory = "/tmp/";
$cache_lifetime  = 86400; // time to keep cache in seconds. 24 hours = 86400sec

$sql4 = "SELECT count(*) FROM `tpf_rides` WHERE `type` LIKE '%Roller Coaster%'";

$cache_key  = md5($sql4); //generate a semi-unique identifier for the query
$cache_file = $cache_directory . $cache_key; // generate full cache file path

if (!file_exists($cache_file) || time() <= strtotime(filemtime($cache)) + $cache_lifetime)
{
    // cache file doesn't exist or has expired
    $result4  = $pdo->query($sql4);
    $coasters = $result4->fetchColumn();
    file_put_contents($cache_file, $coasters); // store the result in a cache file
} else {
    // file exists and data is up to date
    $coasters = file_get_contents($cache_file);
}

これを、問題のさまざまな側面を処理する関数に分解することを強くお勧めします。

于 2013-08-08T00:59:45.233 に答える