對於一個表(我們說'食物'),有一個列'type',其中有一個潛在值[1,2,3,4],用於指定該條目的類型(例如水果)。正如我預期選擇喜歡分類字段是否需要索引? (MySQL或MongoDB)
SELECT name FROM food WHERE type = 3 ;
會經常叫,我不知道會索引在這種情況下建議。由於該字段不知該指數將是有用的只有幾個值可能。(同樣,對於MongoDB的?)
對於一個表(我們說'食物'),有一個列'type',其中有一個潛在值[1,2,3,4],用於指定該條目的類型(例如水果)。正如我預期選擇喜歡分類字段是否需要索引? (MySQL或MongoDB)
SELECT name FROM food WHERE type = 3 ;
會經常叫,我不知道會索引在這種情況下建議。由於該字段不知該指數將是有用的只有幾個值可能。(同樣,對於MongoDB的?)
這樣的字段上的索引可能不是在MySQL中是有用的。實際上,這樣的索引可能會讓大多數查詢變得更糟。
有一種情況,索引總是會更快。這是只有使用索引中的列,例如查詢:
select count(type)
from food
where type = 3;
這是更快,因爲讀取索引應該比讀表更快,因爲數據是較小的(大概是,你可以包括索引中的所有列)。
在其他情況下,MySQL在表格可用時使用索引。
你問的問題是關於索引的「選擇性」。考慮你的查詢:
SELECT name
FROM food
WHERE type = 3 ;
如果所有的行具有type = 3
,那麼你無論如何都要讀取所有符合條件的記錄(獲得的name
值)。如果每頁有一條記錄,那麼索引可能會幫助你,因爲它減少了頁面讀取次數。更現實的情況是頁面會包含100條記錄。然後,如果25%的記錄具有相同的類型,則典型頁面上會有25個這樣的記錄。基本上,每一頁仍然需要閱讀。問題在於頁面是按順序讀取(「全表掃描」)還是通過索引讀取。
這兩種閱讀表格的方式是有區別的。在全表掃描中,按順序讀取頁面,一旦讀取頁面,就不會再次訪問頁面。在索引讀取中,頁面隨機讀取,一次一個記錄,並且頁面可以多次讀取。在極端情況下,頁面不適合頁面緩存,並且同一頁面將刷新到磁盤併爲頁面上的每條記錄重複讀取。非常低效。
您可以通過其在type, name
索引這個查詢效率更高。
所以,回答你的問題是要小心指數,尤其是大表。如果確實在分類列上有索引,請將其作爲複合索引,這樣只有使用索引才能滿足查詢,而不必返回數據頁面。
具有指數是不太可能有幫助,但你應該用你的查詢和數據測試。如果列中有幾個不同的值,查詢將返回表的行的大部分,並且讀取索引等同於全表掃描。實際上,全表掃描甚至可能比讀取索引更快。
如果行的類型在其他的查詢使用它可以幫助有型爲多列索引的一部分。
這取決於正在運行的其他查詢以及文檔的架構和磁盤上的文檔大小以及此服務器是否具有ssds – Sammaye