我有这样的查询:
SELECT
SUM(c.cantitate) AS num,
p.id AS pid,
p.titlu AS titlu,
p.alias AS alias,
p.gramaj AS gramaj,
p.prettotal AS prettotal,
p.pretunitar AS pretunitar,
p.pretredus AS pretredus,
p.stoc AS stoc,
p.cant_variabila AS cant_variabila,
p.nou AS nou,
p.congelat AS congelat,
p.cod AS cod,
p.poza AS poza,
cc.seo AS seo
FROM produse p
LEFT JOIN (SELECT produs, cantitate, COS FROM comenzi) c ON p.id = c.produs
LEFT JOIN (SELECT STATUS, id FROM cosuri) cs ON c.cos = cs.id
LEFT JOIN (SELECT id, seo FROM categorii) cc ON p.categorie = cc.id
WHERE cs.status = 'closed' AND p.vizibil = '1'
GROUP BY pid
ORDER BY num DESC
LIMIT 0, 14
查询正常,但 1 个查询的持续时间:2.922 秒。 如何改进查询?
按键如下:
comenzi: cos, produs 作为唯一键
cosuri: id 作为唯一键
产品:标题、类别、别名作为键
最佳答案
因为您有很多子查询
,所以时间将花在读取完整数据上。如果您直接在表上应用联接而不是子查询
,它将提高性能。
去掉所有子查询后再试试。喜欢:
SELECT
SUM(c.cantitate) AS num,
p.id AS pid,
p.titlu AS titlu,
p.alias AS alias,
p.gramaj AS gramaj,
p.prettotal AS prettotal,
p.pretunitar AS pretunitar,
p.pretredus AS pretredus,
p.stoc AS stoc,
p.cant_variabila AS cant_variabila,
p.nou AS nou,
p.congelat AS congelat,
p.cod AS cod,
p.poza AS poza,
cc.seo AS seo
FROM produse p
LEFT JOIN comenzi c
ON p.id = c.produs
LEFT JOIN cosuri cs
ON c.cos = cs.id
LEFT JOIN categorii cc
ON p.categorie = cc.id
WHERE cs.status = 'closed'
AND p.vizibil = '1'
GROUP BY pid
ORDER BY num DESC
LIMIT 0, 14
您还应该具有以下索引:
+---------+------------+
| TABLE | COLUMN |
+---------+------------+
| produse | categorie |
| produse | vizibil |
| comenzi | produs |
| comenzi | cos |
| cosuri | status |
+---------+------------+
假设 id
列表在所有表中都是 PK
,否则这些列也需要 index
。
关于mysql - 优化mysql多重左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24202717/