如何使用多个连接优化MySQL查询?

时间:2012-01-21 00:58:41

标签: mysql sql database optimization query-optimization

关于如何优化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

关于如何调整此查询的任何评论?

感谢。

2 个答案:

答案 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)的搜索的复杂性。