【发布时间】:2015-09-09 11:14:53
【问题描述】:
我正在显示一页日记事件以及客户详细信息和他们案例的最新记录。
我正在使用 Laravel 的查询生成器,我现在的查询是:
$data['events'] = DB::table('events')
->where('cancelled', 0)
->where('complete', 0)
->join('clients', 'events.clientid', '=', 'clients.id')
->join('notes', function ($join) {
$join->on('events.clientid', '=', 'notes.clientid')
->on('notes.created_at', '=', DB::raw('(select created_at from notes where clientid = clients.id ORDER BY created_at DESC LIMIT 1)'));
})
->select('events.*', 'clients.firstname', 'clients.surname', 'notes.note')
->orderBy('eventtime', 'asc')->paginate(75); //Load events sorted by time
由此产生的 SQL 输出为:
select `events`.*, `clients`.`firstname`, `clients`.`surname`, `notes`.`note` from `events`
inner join `clients` on `events`.`clientid` = `clients`.`id`
inner join `notes` on `events`.`clientid` = `notes`.`clientid`
and `notes`.`created_at` = (
select created_at from notes where clientid = clients.id ORDER BY created_at DESC LIMIT 1)
where `cancelled` = ? and `complete` = ? order by `eventtime` asc
查询运行良好,但随着表的增大而变得非常缓慢。大约需要 30 秒才能完成,并且是唯一运行如此缓慢的查询。
有没有更好的方法来组织连接?在单独的查询中获取最新的注释是否有意义?
非常感谢,
山姆
【问题讨论】:
-
数据库查询优化问题可能更适合Database Administrators 站点。
-
执行
EXPLAIN select events.*,...并向我们展示输出 -
为join中使用的所有字段和where条件添加索引
-
向我们展示索引和基数以及解释计划
-
现阶段不知道如何从 Laravel 生成解释。任何想法,并很乐意发布任何内容。
标签: php mysql laravel join inner-join