gpt4 book ai didi

php - MySQL join across 3 tables running very slowly

转载 作者:行者123 更新时间:2023-11-29 04:18:40 24 4
gpt4 key购买 nike

我正在显示一页日记事件以及客户详细信息和他们案例中的最新记录。

我正在使用 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 秒才能完成,并且是唯一运行缓慢的查询。

有没有更好的方法来组织连接?在单独的查询中获取最新的注释是否有意义?

非常感谢,

山姆

最佳答案

这些索引会很有帮助

  1. 事件(clientid)
  2. 客户(id)
  3. notes(clientid,created_at)
  4. notes(created_at,clientid)

请注意,4 可能是notes(created_at,clientid,cacelled,complete,eventtime) 我不会向它添加注释,使其成为覆盖索引,因为注释太宽了。

关于php - MySQL join across 3 tables running very slowly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32478065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com