3

我有一个这样做的查询:

SELECT `threaded_comments`.* FROM `threaded_comments` WHERE `threaded_comments`.`parent_id` IN (4, 5)

我还在 parent_id 列上设置了一个索引。

当我对查询进行 EXPLAIN SELECT 检查时,我得到以下信息:

`select_type`,`table`,`type`,`possible_keys`,`key`,`key_len`,`ref`,`rows`,`Extra`
'SIMPLE', 'threaded_comments', 'ALL', 'COMMENT_PARENT', NULL, NULL, NULL, 3, 'Using where'

看起来没有键用于索引的 where 子句。但是,当我做一个简单的 parent_id = 4 时,它就可以了。但是当我执行 parent_id=4 或 parent_id=5 时,它会显示相同的消息。

我发现它与 innoDB 数据库表类型有关。当在特定数据库引擎上执行 IN 操作时,MySQL 似乎不喜欢它。这可能是 EXPLAIN 工具的问题,还是 InnoDB 缺少的东西?

4

3 回答 3

4

不,它与 InnoDB 无关。您的 EXPLAIN 计划显示查询能够使用索引,但 MySQL 优化器决定不使用它。选择的决定取决于许多因素。但是当你的表长大后,如果优化器认为它有用,它可以做出不同的决定。如果您想在该查询上显式使用索引,那么您可以尝试强制索引

于 2011-08-20T22:25:47.103 回答
1

似乎您的表中的行数太少,最好使用全扫描。

于 2011-08-20T22:01:56.003 回答
1

索引并不总是一种好处。

文档中:

查询每个表索引,并使用最佳索引,除非优化器认为使用表扫描更有效。曾经,根据最佳索引是否跨越超过 30% 的表来使用扫描,但固定百分比不再决定使用索引还是扫描之间的选择。优化器现在更加复杂,它的估计基于其他因素,例如表大小、行数和 I/O 块大小。

在您的情况下,索引被认为是好的,parent_id = 4但表扫描是首选parent_id IN (4, 5)

于 2011-08-20T22:26:15.777 回答