mysql 聯合索引的兩種特殊場景

Lucky小黄人^_^發表於2024-03-29

1、某些場景下可以把篩選力度小的欄位在聯合索引中的欄位順序提前

我們都知道,聯合索引比對每個列分別建索引更有優勢,因為索引建立得越多就越佔磁碟空間,在更新資料的時候速度會更慢。另外建立多列索引時,順序也是需要注意的,應該將嚴格的索引放在前面,這樣篩選的力度會更大,效率更高。

但是如果某欄位的值是唯一對應另一個欄位的值,那麼可以考慮把篩選力度小的放在前面,比如:

每個訂單唯一所屬於一個業務線,如果把order_id欄位放在聯合索引第一個欄位,索引為 (order_id, biz_line) ,其實就沒必要加biz_line索引了,但是如果把biz_line放在索引第一個欄位(假設order_id查詢時總能攜帶上業務線),索引為 (biz_line, order_id) 可以省去一個biz_line單列索引的儲存開銷,又能滿足我們的索引查詢要求。

select * from order_log where biz_line = 10 and order_id in(111, 222, 333);

2、同個 sql 裡需要對多個欄位進行範圍查詢時,選擇篩選力度大的欄位作為索引

一般來說,建索引時優先選擇篩選力度大的欄位作為索引欄位,比如同個 sql 裡需要對多個欄位進行範圍查詢時,選擇篩選力度大的欄位作為索引,比如下面這個 sql,create_time做大於比較,update_time做小於比較,一般來說做大於比較查詢結果數較少(小於比較會查詢建表至邊界值的所有記錄),所以應該把create_time作為索引欄位,而不是 update_time

select * from order_log where biz_line = 10 and create_time > 10 and update_time < 100 limit 1000;

相關文章