【发布时间】:2017-08-15 18:59:12
【问题描述】:
我有下一个 innodb 表:
CREATE TABLE events (
id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
server int(11) UNSIGNED NOT NULL,
internal_id bigint(20) UNSIGNED NOT NULL,
pid int(11) UNSIGNED NOT NULL,
event_datetime DATETIME NOT NULL,
event_stamp int(11) NOT NULL,
status tinyint(3) UNSIGNED NOT NULL DEFAULT 1,
PRIMARY KEY (id),
INDEX IDX_events (event_stamp, pid),
INDEX IDX_events2 (event_stamp),
UNIQUE INDEX UK_events_hash (internal_id, server)
)
ENGINE = INNODB;
记录数为 ~ 5 百万。当我执行下一条 SQL 时:
EXPLAIN SELECT SQL_NO_CACHE id, internal_id, pid, status FROM events WHERE event_stamp BETWEEN UNIX_TIMESTAMP('2017-01-01') AND UNIX_TIMESTAMP(CURDATE());
Profiler 说有 2 个可能的索引,但没有使用。总执行时间为 0.105 毫秒。然后我添加“FORCE INDEX (IDX_events2)”,分析器说使用了索引,总执行时间为 0.02 毫秒。
那么为什么优化器认为不使用 index 并遍历大约 200 万条记录比使用 index 更快?使用索引执行得更快,而且合乎逻辑。
解释输出:1 SIMPLE c (null) ALL IDX_events,IDX_events2 (null) (null) (null) 5944539 50 Using where
并且用力:1 SIMPLE c (null) range IDX_events2 IDX_events2 4 (null) 2972269 100 Using index condition
【问题讨论】:
-
除非我误解:0.105ms 比 0.020ms 长。
-
是的,我不明白为什么优化器不使用索引。使用力指数更快
-
为我们提供有力和不强大的解释
-
@Noob 好的,我在问题中添加了解释输出。
-
@hadwin 请不仅提供输出,还提供整个查询和输出