2010-08-19 37 views
0

我有3个表t1,t2,t3,每个表有35K个记录。最佳查询写入

select t1.col1,t2.col2,t3.col3 
    from table1 t1,table2 t2,table3 t3 
where t1.col1 = t2.col1 
    and t1.col1 = 100 
    and t3.col3 = t2.col3 
    and t3.col4 = 101 
    and t1.col2 = 102; 

需要更多时间才能返回结果(15秒)。我有适当的索引。

什么是重写它的最佳方式?

+3

并且这返回结果?你有t1.col2 = 100 _and_ t1.col2 = 102 - 有趣的标准! – 2010-08-19 23:58:53

+0

抱歉错字错误。 – Sharpeye500 2010-08-20 00:10:18

回答

0

如果您有一个基于t1.Col1或t1.Col2的索引,请使用THAT作为WHERE子句的第一部分。然后,通过使用“STRAIGHT_JOIN”子句,它会告诉MySQL执行与我在此列出的完全相同的操作。是的,这是旧的ANSI查询语法,它仍然是完全有效的(就像你原来也是这样),但应该很快就会出现回应。 where子句的前两个将立即限制数据集,而其余的实际上完成了与其他表的连接...

select STRAIGHT_JOIN 
     t1.Col1, 
     t2.Col2, 
     t3.Col3 
    from 
     table1 t1, 
     table2 t2, 
     table3 t3 
    where 
      t1.Col1 = 100 
     and t1.Col2 = 102 
     and t1.col1 = t2.col1 
     and t2.col3 = t3.col3 
     and t3.Col4 = 101 
+0

谢谢。当我使用STRAIGHT_JOIN&STRAIGHT_JOIN运行相同的查询时,它会产生什么差异,因为如果我使用STRAIGHT_JOIN,我应该能够解释原因。 – Sharpeye500 2010-08-20 00:36:32

+0

有时候,SQL系统会尝试根据内部统计信息可以确定的一系列其他元素进行优化。我正在查询拥有超过一千五百万条记录的政府数据。由于它试图使用查询表作为查询的基础,因此会导致性能下降。当我将它重定向到使用MY PRIMARY表格作为基础时,它会浏览数据。您最清楚自己的“主要”基础是什么,以及次要/查找表是什么,所以您有时可以更好地判断哪个表应该用作处理的主要表。 – DRapp 2010-08-20 00:39:51

+1

@Sharpeye,顺便说一句,你从上面的查询得到的结果是什么,从原来的15秒... – DRapp 2010-08-20 01:08:59

2

Explain Extended放在它的前面可能是最好的。这会让你很清楚它是或不在使用什么索引。如果您需要帮助解析结果,请在您的问题中包含输出。

+0

谢谢,当我运行explain语句时,我看到'不可能的WHERE在读完const表之后注意到'作为额外的消息,你对此有什么想法吗? – Sharpeye500 2010-08-20 00:12:18

+0

它通常意味着你的where语句永远不会是真的。在你修正上面评论中提到的错字之后,是否这样?在不可能的地方,你不应该得到任何结果,它应该很快返回。 – Kibbee 2010-08-20 00:17:19

+0

哪里陈述是好的,只是为了表明查询语法的样本查询,我做了,而这样做,我做了我编辑过的错字错误。 – Sharpeye500 2010-08-20 00:20:26