Sql 最佳查询写入

Sql 最佳查询写入,sql,mysql,Sql,Mysql,我有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、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秒)。我有适当的索引


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

运行查询时,最好在查询前面放置一个位置。这将让您很好地了解它使用或不使用的索引。如果需要帮助解析结果,请在问题中包含输出。

如果有基于t1.Col1或t1.Col2的索引,请将其用作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

这会返回结果吗?这里有t1.col2=100和t1.col2=102,这是一个有趣的标准!谢谢,当我用select运行explain语句时,我看到了一条额外的消息“不可能,在阅读const tables后注意到了哪里”,你对此有什么想法吗?这通常意味着你的WHERE语句永远不会是真的。这是在你修正了上面评论中提到的打字错误之后发生的吗?使用“不可能在哪里”时,您不应该返回任何结果,它应该会很快返回。where语句很好,只是为了指示查询语法的示例查询,我这样做了,同时我编辑了一个输入错误。如果您得到“不可能在哪里”,您不应该返回任何结果,它应该马上回来。删除扩展的解释,看看您得到了什么结果。谢谢。当我使用STRAIGHT_JOIN运行同一个查询时会有什么不同?如果使用STRAIGHT_JOIN,我应该能够解释原因。有时,SQL系统会尝试基于一系列其他元素进行优化,这些元素可以从内部统计信息中确定。我当时正在查询1500多万条记录的政府数据。因为它试图使用查找表作为查询的基础,所以它降低了性能。当我重定向它以我的主表为基础时,它在数据中快速移动。您最清楚自己的“主要”基础是什么,以及辅助/查找表是什么,因此有时您可以更好地判断哪个表应该用作处理的主要表。@Sharpeye,顺便说一句,从最初的15秒开始,通过上面的查询,您的性能结果是什么。。。