一、問題:
如下的一個查詢,按常理,應該會選擇enter_day,但優化器選擇的是:d_index。這是否是優化器選擇錯誤,其實不一定,兩者的成本是一樣的,請看測試。
有個表,表結構如下,這里只截取一部分,但可以說明問題:
enter_day的定義是:`enter_day` int(11) NOT NULL DEFAULT '0' COMMENT '進入日期(整型)',
共有4個索引,包含這個列
二、測試過程:
看看這個表的數據量:2314234。大小3.5G。MySQL 版本是 5.5.24
數據量不算大,沒有選擇enter_day的原因,猜測是因為兩者的代價是一樣的,所以對於MySQL來說,兩者沒區別。
下面進行測試:
正常查詢,可以看到Handler_read_next為229804
再查一次,可以看到Handler_read_next還是增加229804,即229804*2=459608
那下面指定強制索引,再做一次測試,發現Handler_read_next也是229804(689412-459608=229804)。說明代價還真的是一樣的。
三、結論:
選擇哪個索引,對於MySQL來說,成本是一樣的,無所謂對錯,所以默認選擇d_index,不算是錯誤。