繁体   English   中英

与多个表的左联接。 表现不佳

[英]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列索引在进行过滤和排序时会有所帮助; 它是“覆盖”。
  • 6 ORDER BY + LIMIT将中间表最小化到80行。 最后一个是因为子查询不需要保留排序。
  • main.id > 0是一种痛苦-我们可以摆脱它吗?
  • 假设没有复制,则使用ALL而不是DISTINCT
  • SELECT *是一种痛苦; 可以避免吗? 因此,我弄乱了列的确切列表。
  • JOIN回到main是为了避免拖拉main.*所有内容main.* 取而代之的是只需要提取80个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM