MySQL内部加入IN子句

时间:2013-09-20 19:44:53

标签: mysql inner-join

这句话是否已优化?

select d.id, d.wfid, d.docid , k.keyword, k.value from keywords k
inner join documents d 
where k.document_id in (23,24) AND k.document_id = d.id;

我有一些ID来自POST(23,24),我只需要获取它们的信息,所以为此我做了IN。以下是硬编码用于测试目的。

我知道MySQL会解析句子并生成更优化的句子。有没有办法得到这句话,所以我一直避免让mysql优化它?

谢谢!

3 个答案:

答案 0 :(得分:2)

在所有数据库引擎中,查询被解析为执行计划,该计划告诉引擎如何在给定表中给出索引,结构和数据的情况下有效地运行查询。完成一次后,引擎可以重用SAME查询的计划。

如果使用参数替换23,24,则即使参数值发生更改,引擎也会将所有查询视为相同。通常这是一件好事,但可能会导致问题。如果遇到问题,请在google上搜索参数嗅探。否则,只要存储计划,sql引擎就不会再多次优化查询一次(通常直到服务器重启或者由于不使用而导致计划被丢弃)。

答案 1 :(得分:2)

如果你运行这些,你会看到MySQL重写如何处理它们。 请注意,show warnings中的SQL并不总是有效的SQL语法

explain extended select d.id, d.wfid, d.docid , k.keyword, k.value from keywords k
inner join documents d 
where k.document_id in (23,24) AND k.document_id = d.id;
show warnings;

答案 2 :(得分:1)

你错过了ON条款,它应该是那样的

   select d.id, d.wfid, d.docid , k.keyword, k.value from keywords k
   inner join documents d  ON k.document_id = d.id
   where k.document_id in (23,24)  ;