我的下一個InnoDB表:Mysql的不正確的優化器的工作
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)
」,Profiler說使用索引,總執行時間爲0.02毫秒。
那麼爲什麼優化器會認爲不使用索引並且通過~2百萬條記錄比使用索引更快?以更快的速度執行索引,這是合乎邏輯的。
Explain輸出:
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。 – RToyo
是的,我不明白爲什麼優化器不使用索引。隨着力量指數它更快 – hadwin
提供我們的力量和沒有力量的解釋 – Noob