2012-01-21 177 views
1

关于如何优化MySQL查询中的连接的任何输入?例如,考虑以下查询如何优化多个连接的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和string_comment的FULLTEXT索引作为string_idx。EXPLAIN命令仍然给出了如下所示的相同结果。 另外,请注意, 名称和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 

我如何能调整任何评论此查询?

谢谢。

回答

1

对于每个表,您应该在两列上创建一个复合索引。语法有点不同,但它是这样的:

CREATE INDEX comp_E_idx E(name, string_comment) 

并重复所有表。 单独的索引不会帮助,因为当它试图合并时,它们是无用的。它在索引中搜索名字的速度非常快,但必须迭代才能找到评论

+0

您还应该调用ANALYZE TABLE这将进一步帮助调整查询。 –

0

您在问是否可以调整查询。我首先会问,数据本身是否可以调整。即请考虑将A,B,C,D和E中的数据放入具有NULL列的单个表中。这将减少搜索从O(N^5)到O(N)的复杂性。