您好,我喜欢做一个高性能的订单查询。这是我的问题:
SELECT a.status,a.title,a.id,
b.deployed,b.accepted,b.rejected,b.error
FROM a
LEFT JOIN b ON ( a.id = b.id )
WHERE b.agencyid = 1 AND a.userid = 3
ORDER BY a.date DESC
LIMIT 0,50如果不使用ORDER BY子句,则查询需要0.006秒,如果使用ORDER BY子句,则需要1.1181秒!
最多的时间消耗来自复制到Tmp表1,1 s 99,78% 1,1,1 s如何减少复制到tpm表的时间?
发布于 2014-12-21 23:42:22
首先,正如Strawberry所指出的,因为您在where子句中引用了"b“别名,并且没有考虑NULL,所以它本质上将您的左连接转换为内连接。
SELECT
a.status,
a.title,
a.id,
b.deployed,
b.accepted,
b.rejected,
b.error
FROM a JOIN b
ON a.id = b.id
WHERE
a.userid = 3
AND b.agencyid = 1
ORDER BY
a.date DESC
LIMIT
0,50如果您希望它是左连接(所有"a“记录,不管"b”表中是否有匹配),那么您需要将"b“限定符移动到JOIN子句。
SELECT
a.status,
a.title,
a.id,
b.deployed,
b.accepted,
b.rejected,
b.error
FROM a LEFT JOIN b
ON a.id = b.id
AND b.agencyid = 1
WHERE
a.userid = 3
ORDER BY
a.date DESC
LIMIT
0,50也就是说,您正在寻找按日期排序的特定用户。我会让你的"a“表在(userid,date)上建立索引,这样引擎就可以在你的WHERE限定符和order by上进行优化,并且应该解决你的性能问题,而不管left和inner ...
为了帮助你的"b“表的连接条件,索引它(id,agencyid)
https://stackoverflow.com/questions/27588491
复制相似问题