1

我有这个项目在这里玩费城犯罪数据。我正在构建此查询以按类型和警区选择事件。在 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

4

0 回答 0