私はここでこのプロジェクトをフィラデルフィアの犯罪データで遊んでいます。このクエリを作成して、タイプと警察署ごとにインシデントを選択します。PHP と Zend では 21 秒かかりますが、コマンド ラインでは 3 秒未満です。
次のようなデバッグ出力で Zend_Db_Profiler を使用してデバッグします。
numQueries: 2
クエリ: 接続
経過秒数: 0.0019519329071045
クエリ: SELECT "インシデント".* FROM "インシデント" WHERE (dc_dist = '15') AND (lower(text_general_code) = 'homicide') GROUP BY "location_block"
経過秒数: 21.583115816116
同じ select ステートメントをコピーして sqlite3 コマンド ライン クライアントに貼り付けると、おそらく 3 秒かかります。
ここで何か不足していますか?Zend に 21 秒かかるのはなぜですか?
アップデート:
PDO を使用してスクリプトだけを実行しても、21 秒のクエリが発生します。
// Create (connect to) SQLite database in file
$file_db = new PDO('sqlite:../db/crime.db');
// Set errormode to exceptions
$file_db->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
$start_time = microtime(true);
// Select all data from memory db messages table
$result = $file_db->query("SELECT 'incident'.* FROM 'incident' WHERE (dc_dist = '15') AND (lower(text_general_code) = 'homicide') GROUP BY 'location_block'");
$end_time = microtime(true);
$elapsed_time = $end_time - $start_time;
print "query took " . $elapsed_time . " seconds\n";
出力:
クエリに 21.751929998398 秒かかりました
2回目の更新
それをすべて保持しているのは、SQLステートメントへの追加によるグループのようです。それを削除して、pdo スクリプトまたは zend フレームワーク アプリケーションを実行すると、コマンド ラインから直接実行した場合と同じ速度に達します。
「GROUP BY」句を使用すると、23 秒:
numQueries: 2
クエリ: 接続
経過秒数: 0.0007779598236084
クエリ: SELECT "インシデント".* FROM "インシデント" WHERE (dc_dist = '15') AND (lower(text_general_code) = 'homicide') GROUP BY "location_block"
経過秒数: 23.092380046844
'GROUP BY' 句を使用しない場合、1 秒未満:
numQueries: 2 クエリ: 接続
経過秒数: 0.0011060237884521
クエリ: SELECT "インシデント".* FROM "インシデント" WHERE (dc_dist = '15') AND (lower(text_general_code) = 'homicide')
経過秒数: 0.080777883529663