我有这个项目在这里玩费城犯罪数据。我正在构建此查询以按类型和警区选择事件。在 PHP 和 Zend 中需要 21 秒,但在命令行中不到 3 秒。
我使用 Zend_Db_Profiler 进行调试,调试输出如下:
numQueries:2
查询:连接
经过的秒数:0.0019519329071045
查询:选择“事件”。* FROM“事件”在哪里(dc_dist = '15')和(较低(text_general_code)='凶杀案')按“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 秒
第二次更新
看起来它是除了 sql 语句之外的组,它把它全部支撑起来。如果我删除它,然后运行 pdo 脚本或 zend 框架应用程序,它会达到与直接从命令行相同的速度:
使用 'GROUP BY' 子句,23 秒:
numQueries: 2
query: connect
elapsed seconds: 0.0007779598236084
query: SELECT "incident".* FROM "incident" WHERE (dc_dist = '15') AND (lower(text_general_code) = 'homicide') GROUP BY "location_block"
经过的秒数:23.092380046844
没有 'GROUP BY' 子句,在一秒钟内:
numQueries: 2 查询:连接
经过的秒数:0.0011060237884521
查询:选择“事件”。* FROM “事件”WHERE (dc_dist = '15') AND (lower(text_general_code) = 'homicide')
经过的秒数:0.080777883529663