3

这句话优化了吗?

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;

我有一些通过POST(23,24) 的 ID,我只需要获取他们的信息,所以我这样做了IN. 这里是硬编码的,用于测试目的。

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

谢谢!

4

3 回答 3

2

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

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

于 2013-09-20T20:08:02.930 回答
2

如果你运行这些,你会看到 MySQL rewrite 是如何处理它们的。 注意显示警告中的 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;
于 2013-09-20T20:25:12.223 回答
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)  ;
于 2013-09-20T19:56:12.057 回答