mysql - 如何使用具有索引键的 IN 优化 SQL 查询

标签 mysql indexing explain where-in

我正在运行此查询

EXPLAIN SELECT id, timestamp from foo where id IN (23,67,78,90) order by ASC

这里的id已被索引。但是当我运行 Explain 时,我在 Extra

中的 Using where;Using Index 中得到了这个
+----+-------------+---------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+---------------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | foo   | range | PRIMARY       | PRIMARY | 8       | NULL |   12  | Using where;Using Index|
+----+-------------+---------------+-------+---------------+---------+---------+------+------+-------------+

但是当我使用单个 id 运行相同的查询时,Extra 中没有任何内容,它在索引的情况下按预期工作

EXPLAIN SELECT id, timestamp from foo where id = 23`

+----+-------------+---------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table| type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+---------------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | foo | range | PRIMARY       | PRIMARY | 8       | NULL |  1 |        |
+----+-------------+---------------+-------+---------------+---------+---------+------+------+-------------+

我认为 IN 有问题。谁能告诉我优化的方法吗?

最佳答案

据我所知,

IN 查询将比单个“=”花费更多时间。如果“IN”具有单个值,则它等于单个“=”查询。

因为它是“=”或“=”的多重或条件。

id 将与“IN”数组中的每 4 个值匹配。

Only way to optimise is to have index.

更新:

如果 Extra 列还显示Using where,则表示该索引用于执行键值查找。如果不使用 where,优化器可能会读取索引以避免读取数据行,但不会将其用于查找。例如,如果索引是查询的覆盖索引,优化器可能会扫描它而不使用它进行查找。请参阅explanation

关于mysql - 如何使用具有索引键的 IN 优化 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33008878/

相关文章:

mysql - MySQL 解释计划、多字段索引和 OR 子句的问题

mysql - EXPLAIN 打印中的额外信息 - 'Impossible WHERE noticed after reading const tables'

php - SQL/PHP - 关键更新

php - 在 WHERE 子句中使用 SELECT IF

database - VFP 索引并在 CDX 存在时使用 INDEX ON 保存

mysql - 索引一个不断变化的字段是否合理,或者不断写入会降低性能吗?

mysql - 我如何知道 MySQL 中 `auto_key0` 索引后面的内容是什么?

php - mysql_connect 连接生命周期

java - 为什么 java.util.list 添加以前的数据,而在添加新数据时这些数据被清除了

C# 'Index was outside the bounds of the array.' 用于一个数组而不是另一个