前言
瞭解B樹和哈希數據結構有助於預測查詢在這些使用不同索引數據結構的存儲引擎上的執行情況,特別是對於MEMORY存儲引擎,它是允許您選擇B樹或哈希作爲索引的存儲引擎。
一、 B樹指數特徵
B樹索引可以在使用表達式中使用的對列的比較 =, >, >=, <, <=,或BETWEEN關鍵字。如果使用LIKE 或to LIKE且是一個不以通配符開頭的常量字符串,則索引也可用於比較 。
1.例如,以下SELECT語句將使用索引:
SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';
在第一個語句中 'Patrick' <= key_col < 'Patricl',在第二個語句中'Pat' <= key_col < 'Pau'
2.以下SELECT語句不使用索引:
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE other_col;
在第一個語句中,LIKE 值以通配符開頭。在第二個語句中,該LIKE值不是常量。
如果使用了像'%string%'且長度超過三個字符的字符串查詢,那麼MySQL將使用Turbo Boyer-Moore算法初始化這個模型,用這個模型來匹配速度會更快.
不跨越子句中的所有AND級別的 任何索引 WHERE不用於優化查詢。換句話說,爲了能夠使用索引,必須在每個AND組中使用索引的前綴 。
3.以下WHERE子句使用索引:
WHERE index_part1=1 AND index_part2=2 AND other_column=3 /* index = 1 OR index = 2 */ WHERE index=1 OR A=10 AND index=2 /* optimized like "index_part1='hello'" */ WHERE index_part1='hello' AND index_part3=5 /* Can use index on index1 but not on index2 or index3 */ WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;
4.這些WHERE子句 不使用索引:
/* index_part1 is not used */ WHERE index_part2=1 AND index_part3=2 /* Index is not used in both parts of the WHERE clause */ WHERE index=1 OR A=10 /* No index spans all rows */ WHERE index_part1=1 OR index_part2=10
有時MySQL不使用索引,即使有索引也是如此。發生這種情況的一種原因是,優化器估計使用索引將需要MySQL訪問表中非常大比例的行。(在這種情況下,表掃描可能會快得多,因爲它需要的搜索次數較少。)但是,如果這樣的查詢:例如LIMIT只用於檢索某些行,那麼MySQL無論如何都會使用索引,因爲它可以更快地找到在結果中返回幾行。
二、哈希指數特徵
散列索引與剛纔討論的特徵有些不同:
它們僅用於使用=或<=>(文章結尾有此符號說明) 運算符的相等比較 (但速度非常快)。它們不用於比較運算符,例如 <找到一系列值。依賴於這種類型的單值查找的系統被稱爲“ 鍵值存儲 ” ; 要將MySQL用於鍵值查找類,請儘可能使用哈希索引。
優化器無法使用哈希索引來加速 ORDER BY操作。(此類索引不能用於按順序搜索下一個條目。)
MySQL無法確定兩個值之間大約有多少行(範圍優化器使用它來決定使用哪個索引)。如果將 MyISAM或 InnoDB表更改爲哈希索引 MEMORY表,則可能會影響某些查詢。
只有整個鍵可用於搜索行。(使用B樹索引,鍵的任何最左邊的前綴都可用於查找行。)
附錄
解釋=和<=>的區別:
相同點:
像常規的=運算符一樣,兩個值進行比較,結果是0(不等於)或1(相等),換句話說:’A'<=>’B'得0和’a'<=>’a‘得1,都是值的比較。
不同點:
NULL的值是沒有任何意義的。所以=號運算符不能把NULL作爲有效的結果。所以:請使用<=>,'a' <=> NULL 得0 NULL<=> NULL 得出 1。和=運算符正相反,=號運算符規則是 'a'=NULL 結果是NULL 甚至NULL = NULL 結果也是NULL。順便說一句,mysql上幾乎所有的操作符和函數都是這樣工作的,因爲和NULL比較基本上都沒有意義。
用處當兩個操作數中可能含有NULL時,你需要一個一致的語句,此時就可以用<=>.
獲取以上Java高級架構最新視頻,歡迎
加入Java進階架構交流羣:142019080。直接點擊鏈接加羣。
https://jq.qq.com/?_wv=1027&k=5lXBNZ7