在MySQL中使用max和where子句与子查询进行内部联接

时间:2018-10-08 09:05:57

标签: php mysql

SELECT a.ts, b.barcodenumber, a.remarks, c.department 
FROM documentlog a 
INNER JOIN (select docid, max(logid) as logid from documentlog GROUP BY docid) d ON d.docid=a.docid AND d.logid=a.logid 
INNER JOIN user c ON c.uid=a.user 
INNER JOIN document b ON b.id=a.docid
WHERE c.department = 'PTO' AND b.end = 0

我的问题是,当我执行此查询时,它的执行速度像2sec +一样慢,但是数据仅为9,如何加快查询的执行速度?

Old SS for EXPLAIN RESULT

UPDATED SS for EXPLAIN RESULT (Add INDEX logid,docid)

1 个答案:

答案 0 :(得分:0)

查看您的EXPLAIN结果。注意,在查询documentlog表时MySQL不使用任何类型的键,即documentlog表上没有定义键。此时,您的查询中已处理了超过200万条记录。这可能是查询缓慢的最可能原因。

docid表的logiddocumentlog字段上添加索引,并检查它是否可以缩短查询的执行时间。

更新!

更新后的EXPLAIN查询的输出表示它正在使用全表扫描!(即type=ALL)来生成主外部的输出。查询。为什么?这是由于在Where子句中使用的属性(即{departmentend)上没有定义索引这一事实引起的。

通常,如果要加快查询速度,则必须确保为查询的WHERE条件中使用的属性定义了适当的索引。

顺便说一句,您可以通过阅读MySQL的documentation来进一步了解MySQL的EXPLAIN结果的含义。