![](/img/trans.png)
[英]MySQL join performance with order by for large tables. Missing index?
[英]LEFT JOIN with multiple tables. Poor performance
我需要优化以下查询。 我在表中有很多记录:a,b,c,d,查询时间很长。 请寻求帮助。
SELECT main.*, items.*
FROM main
LEFT JOIN (
(SELECT a.*, 1 AS `type` FROM a) UNION
(SELECT b.*, 2 AS `type` FROM b) UNION
(SELECT c.*, 3 AS `type` FROM c) UNION
(SELECT d.*, 4 AS `type` FROM d)
)
items ON main.`to` = items.id AND main.`type` = items.`type`
WHERE main.id > 0
LIMIT 20
! 像这样:
SELECT main.*, z.*
FROM (
( SELECT 1 AS type, main.id AS mid, a.*, xx
FROM main
JOIN a ON a.id = main.to
WHERE main.id > 0 AND main.type = 1
ORDER BY xx
LIMIT 20 )
UNION ALL
( SELECT 2 AS type, main.id, b.*, xx
FROM main
JOIN b ON a.id = main.to
WHERE main.id > 0 AND main.type = 2
ORDER BY xx
LIMIT 20 )
UNION ALL
( SELECT 3 AS type, main.id, c.*, xx
FROM main
JOIN c ON a.id = main.to
WHERE main.id > 0 AND main.type = 3
ORDER BY xx
LIMIT 20 )
UNION ALL
( SELECT 4 AS type, main.id, d.*, xx
FROM main
JOIN d ON a.id = main.to
WHERE main.id > 0 AND main.type = 4
ORDER BY xx
LIMIT 20 )
ORDER BY xx
LIMIT 20 ) z
JOIN main ON main.id = z.mid
ORDER BY xx;
加索引:
main: PRIMARY KEY(id), INDEX(type, xx, id, to)
a,b,c,d: PRIMARY KEY(id)
笔记:
xx
排序,它是main
。 PRIMARY KEY(id)
main
上的4列索引在进行过滤和排序时会有所帮助; 它是“覆盖”。 ORDER BY + LIMIT
将中间表最小化到80行。 最后一个是因为子查询不需要保留排序。 main.id > 0
是一种痛苦-我们可以摆脱它吗? ALL
而不是DISTINCT
。 SELECT *
是一种痛苦; 可以避免吗? 因此,我弄乱了列的确切列表。 JOIN
回到main
是为了避免拖拉main.*
所有内容main.*
取而代之的是只需要提取80个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.