存储过程需要一些时间来获取应用程序层上的数据

时间:2017-08-22 07:29:38

标签: php mysql laravel

我编写了一个与5个表对话的存储过程。

数据库层的性能看起来不错。这是输出。

CALL `meetingsReport`('41', '%', '2016-01-01', '2018-01-01');
/* Affected rows: 0  Found rows: 3,288  Warnings: 0  Duration for 1 query: 4.203 sec. (+ 0.141 sec. network) */

生成报告需要4秒左右,因为数据集很大,我正在执行一些旋转并生成最终的数据集。

当我在应用程序级别(使用laravel php)获取数据并将该过程调用为

    $params = array($eventId, $status, $startTime, $endTime);
    return DB::select('call meetingsReport( ?,?,?,?)', $params);

需要时间,我打印时间戳来检查为什么需要时间。这是输出。

12:26:47am - when the route is hit

12:27:00am - when the data is received by procedure call

花了大约13秒钟。可能是什么原因?

更新

我尝试过PDO

以下是详细信息:

try {
    $dbh = new PDO('mysql:host=localhost;dbname=livedb', 'username', 'password');
    $data = $dbh->query("CALL `meetingsReport`('41', '%', '2016-01-01', '2018-01-01') ");
    echo date("h:i:sa")."<br/>";
    $dbh = null;
} catch (PDOException $e) {
     print "Error!: " . $e->getMessage() . "<br/>";
     die();
}

,输出为:

10:23:22am
10:23:28am

花了6秒钟,我在框架上粘贴了相同的代码,输出是:

01:15:54am
01:16:06am

需要12秒。

2 个答案:

答案 0 :(得分:0)

这可能是由prepare调用的DB::select,这需要额外的时间。

老实说,通过从这5个大型数据集创建报告表/视图,您可能会获得更好的结果。 或者查看这些表上的索引

通过简单地将几个大表组合到一个视图中,我获得了显着的性能提升。

我认为这个DB::select很少被调用,否则你就会遇到一个真正的问题。

答案 1 :(得分:0)

如果您遇到大型数据集的性能问题,请查看本文 http://www.fromdual.com/mysql-materialized-views