我正在运行此查询
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/