[英]What is the correct order for composite indexes (mysql)
我已經讀過,在復合索引中,您應該首先對最具體的列進行排序,但是我的想法是,由於我的理解(或缺乏),最優化的路線是首先覆蓋最不具體的索引索引映射如何在 memory 中工作。 視覺輔助
例如,如果我有一個表, vehicles
有三列, vehicle
、 type
和driver
。
vehicle
可以過濾為 3 個可能的值car
、 bike
、 helicopter
type
可以過濾為6個值, petrol/automatic
, petrol/manual
, diesel/automatic
, diesel/manual
,, electric/automatic
, electric/manual
driver
是驅動程序的名稱(不確定數量的值)
--
如果按vehicle
過濾可以返回 1000 個結果,按type
過濾 500 個結果,按driver
說,3 個結果,那么最佳索引不應該是vehicle, type, driver
嗎? 因為如果索引以driver
開頭,這是否意味着在按type
進一步過濾之前掃描一個巨大的索引,然后是vehicle
?
有人可以幫我澄清一下,並向我解釋一下,如果我應該首先訂購最具體的列,為什么以及它是如何工作的?
=
測試所有 3 列時,它們在INDEX
或WHERE
子句中的順序無關緊要。=
和一些范圍( LIKE
、 BETWEEN
等)時,將=
列放在INDEX
中。 該索引不會在第一個范圍之外使用。 由於這些准則,您可能會發現不同的查詢需要不同INDEXes
。
更多: http://mysql.rjweb.org/doc.php/index_cookbook_mysql
查看基數的另一種方法是它僅適用於整個索引,而不適用於單個列。 選擇性差會導致優化器不使用索引,而是掃描表。
如果按車輛過濾可以返回 1000 個結果,按類型 500 個結果,按司機說,3 個結果
WHERE vehicle = '...' -- no index will be used
WHERE type = '...' -- no index will be used
WHERE driver = '...' -- INDEX(driver, ...) will be used
(那些假設在WHERE
中沒有其他相關內容。)
為了這
WHERE vehicle = '...'
AND type = '...'
AND driver = '...'
這非常有用: INDEX(vehicle, type, driver)
。 此外, WHERE
子句和INDEX
可以有不同的順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.