我目前有一个 SQL 查询需要很长时间才能加载,不知道是否有人可以帮助我?我对 MySQL 还很陌生。
这是查询:
SELECT applicationid
FROM logs
WHERE action = 'VIEWED'
AND userid = '$user'
AND date >= '$dateminus7'
AND applicationid NOT IN (
SELECT applicationid
FROM logs
WHERE userid = '$user'
AND date >= '$dateminus7'
AND (action LIKE 'SUBMITTED NOTE%' OR action LIKE 'CHANGED STATUS%')
)
基本上是通过一些数据库来查找在访问客户帐户时没有留下笔记的用户(非常顽皮)。日志数据库中每周大约有 30,000 条记录,这显然是一个因素,但现在查询运行了一个小时,仍然没有完成(超时,PHP 页面上出现 404 错误)。
需要任何信息只需询问,我将不胜感激任何提示或指示。
编辑:解释结果 http://i.imgur.com/h9bZBe3.png
最佳答案
(userid, date)
上的复合索引应该足以加速此处的两个查询。您还可以尝试(用户ID,日期,操作)
或(操作,用户ID,日期)
。根据哪一列具有更多唯一值,一个索引可能比另一个索引更有效。
请注意,查询计划程序可能无法优化子查询,并且它可能会为外部查询中的每个候选行执行一次子查询。多次运行内部查询的成本可能会导致性能问题。考虑尝试加入,看看是否可以获得更好的性能:
SELECT la.applicationid
FROM logs la
LEFT OUTER JOIN logs lb
ON la.applicationid = lb.applicationid
AND lb.userid = '$user'
AND lb.date >= '$dateminus7'
AND (lb.action LIKE 'SUBMITTED NOTE%' OR lb.action LIKE 'CHANGED STATUS%')
WHERE la.action = 'VIEWED'
AND la.userid = '$user'
AND la.date >= '$dateminus7'
AND lb.applicationid IS NULL;
关于mysql - 使 SQL 查询更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16282533/