1. 程式人生 > >小心MySQL聯合索引的效率陷阱

小心MySQL聯合索引的效率陷阱

場景:

表中有兩個索引:索引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';