小心MySQL聯合索引的效率陷阱
阿新 • • 發佈:2018-12-14
場景:
表中有兩個索引:索引index_1(create_Time, category_id), index_2(category_id)
查詢語句為:select create_time,category_id from table where create_time='15233333333' and category_id='666';
explain結果:
使用了index_2而沒有使用index_1
原因:
當一個表有多條索引可走時, Mysql 根據查詢語句的成本來選擇走哪條索引(選擇索引所在列長度小的), 聯合索引的話, 它往往按照最左原則計算最左邊的一列的大小,那麼create_time明顯要比category_id長的的多,所以查詢構造器預設選擇使用index_2,無法使用聯合索引,查詢效率大大降低。
解決方法:
1、改變聯合索引index_1中兩列的順序,第一列使用長度小的 ORCE INDEX (FIELD1)
2、使用hint強制使用index_1:select create_time,category_id from table force index(index_1) where create_time='15233333333' and category_id='666';