关于如何优化MySQL查询中的连接的任何输入?例如,请考虑以下查询
SELECT E.name, A.id1, B.id2, C.id3, D.id4, E.string_comment
FROM E
JOIN A ON E.name = A.name AND E.string_comment = A.string_comment
JOIN B ON E.name = B.name AND E.string_comment = B.string_comment
JOIN C ON E.name = C.name AND E.string_comment = C.string_comment
JOIN D ON E.name = D.name AND E.string_comment = D.string_comment
表A,B,C,D是临时表,包含1096行,表E(也是临时表)包含426行。在没有创建任何索引的情况下,MySQL EXPLAIN向我展示了从所有表中搜索的所有行。现在,我在所有表A,B,C,B和E上创建了名称为name_idx的FULLTEXT索引和string_idment作为string_idx.EXPLAIN命令仍然给出了与下面所示相同的结果。 另外,请注意 name和string_comment的类型为VARCHAR,idX的类型为int(15)
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE A ALL name_idx,string_idx 1096
1 SIMPLE B ALL name_idx,string_idx 1096 Using where
1 SIMPLE C ALL name_idx,string_idx 1096 Using where
1 SIMPLE D ALL name_idx,string_idx 1096 Using where
1 SIMPLE E ALL name_idx,string_idx 426 Using where
关于如何调整此查询的任何评论?
感谢。
答案 0 :(得分:1)
对于每个表,您应该在两列上创建复合索引。语法略有不同,但它类似于:
CREATE INDEX comp_E_idx E(name, string_comment)
并重复所有表格。 单独的索引无济于事,因为当它试图合并时,它们是无用的。它非常快速地在索引中搜索名称,但是必须迭代才能找到注释
答案 1 :(得分:0)
您询问查询是否可以调整。我首先会询问数据本身是否可以调整。即请考虑将A,B,C,D和E中的数据放入具有NULL-able列的单个表中。这将降低从O(N ^ 5)到O(N)的搜索的复杂性。