2
我在閱讀High Performance MySQL。MySQL:理解WHERE子句應用模式
我想明白了:短語下面
在一般情況下,MySQL能夠以三種方式申請一個WHERE子句,從最好到 最差:
- 報考條件的索引查找操作以消除不匹配的行。這發生在存儲引擎層。
- 使用覆蓋索引(Extra列中的「使用索引」)來避免行訪問,並在從索引檢索每個 結果後過濾掉不匹配的行。這發生在服務器層,但它不需要讀取表中的行。
- 從表中檢索行,然後過濾不匹配的行(Extra列中的「使用where」)。這發生在服務器層,並且 要求服務器在它們可以過濾 之前從表中讀取行。
我的理解:假設我有
table
|-id <- PK
|-field1 <- 1st B-Tree index
|-field2 <- 2nd B-Tree index
|-field3 <- not indexed
- 第一種情況:
SELECT field1 FROM table WHERE id IN (@id1, @id2, ...)
- 第三屆情況:
SELECT * FROM table WHERE field3 = 'blabla'
問題:我不明白我們在哪裏得到第二個案例。
*問題:哪些情況屬於下一個查詢?
SELECT field1, field2 FROM table WHERE field1 = 'blabla'
SELECT field1 FROM table WHERE field1 = 'blabla' AND field2 = 'blabla'
- 我們得到第二種情況?
「覆蓋索引」表示可以應用索引_來減少行集,但不能用於消除所有不匹配的行_。這意味着 - 使用索引將減少搜索行集,但減少的行集仍然需要進一步過濾。通常,當你有多列索引時,就會發生這種情況,你的'SELECT'語句使用它的列的左子集。 –
@AlmaDo例如'SELECT field1,field2 FROM table WHERE ...'。 **問題:當*選擇的字段集合屬於兩個不同的索引時,MySQL將使用覆蓋索引?* –
您錯過了上述查詢中最重要的部分 - WHERE部分。不管你選擇什麼領域,它都不會影響任何東西。但是WHERE條件很重要。此外,MySQL能夠使用_only一個index_進行查詢(但可能會多次使用)。因此,如果條件中的字段是不同索引的一部分,默認情況下,MySQL將選擇最佳選項(即將行集減少到最小)。 –