簡體   English   中英

復合索引的正確順序是什么(mysql)

[英]What is the correct order for composite indexes (mysql)

我已經讀過,在復合索引中,您應該首先對最具體的列進行排序,但是我的想法是,由於我的理解(或缺乏),最優化的路線是首先覆蓋最不具體的索引索引映射如何在 memory 中工作。 視覺輔助

例如,如果我有一個表, vehicles有三列, vehicletypedriver

vehicle可以過濾為 3 個可能的值carbikehelicopter

type可以過濾為6個值, petrol/automaticpetrol/manualdiesel/automaticdiesel/manual ,, electric/automaticelectric/manual

driver是驅動程序的名稱(不確定數量的值)

--

如果按vehicle過濾可以返回 1000 個結果,按type過濾 500 個結果,按driver說,3 個結果,那么最佳索引不應該是vehicle, type, driver嗎? 因為如果索引以driver開頭,這是否意味着在按type進一步過濾之前掃描一個巨大的索引,然后是vehicle

有人可以幫我澄清一下,並向我解釋一下,如果我應該首先訂購最具體的列,為什么以及它是如何工作的?

  • 在為=測試所有 3 列時,它們在INDEXWHERE子句中的順序無關緊要
  • 在測試一些列的=和一些范圍( LIKEBETWEEN等)時,將=列放在INDEX中。 該索引不會在第一個范圍之外使用。
  • 在測試 1 或 2 列時,這些列需要放在首位。

由於這些准則,您可能會發現不同的查詢需要不同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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM