mysql - 使 SQL 查询更快

标签 mysql query-optimization

我目前有一个 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/

相关文章:

php - mysql数据库中的mp4视频为 "blob"

php - 在单个查询中使用两个推测表?

php mysql date.utc 并统计出现次数

mysql - 优化mysql多重左连接

query-optimization - 是否可以进行更快的过滤查询?

php - 呈现表单的安全方式

mysql - JOIN 以奇怪的顺序完成;搞乱 ORDER BY?

php - 按邮政编码距离升序计算和排序用户的最快方法(也是最优化的)

plsql - Oracle 11g PL/SQL PACKAGE 中 CONTANT 变量的位置

MySQL-SELECT * INTO OUTFILE LOCAL?