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