我编写了一个与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秒。
答案 0 :(得分:0)
这可能是由prepare
调用的DB::select
,这需要额外的时间。
老实说,通过从这5个大型数据集创建报告表/视图,您可能会获得更好的结果。 或者查看这些表上的索引
通过简单地将几个大表组合到一个视图中,我获得了显着的性能提升。
我认为这个DB::select
很少被调用,否则你就会遇到一个真正的问题。
答案 1 :(得分:0)
如果您遇到大型数据集的性能问题,请查看本文 http://www.fromdual.com/mysql-materialized-views