首頁  >  文章  >  資料庫  >  B樹和哈希索引的比較(程式碼範例)

B樹和哈希索引的比較(程式碼範例)

不言
不言轉載
2019-03-27 10:08:552083瀏覽

這篇文章帶給大家的內容是關於B樹和哈希索引的比較(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

前言:了解B樹和雜湊資料結構有助於預測查詢在這些使用不同索引資料結構的儲存引擎上的執行情況,特別是對於MEMORY儲存引擎,它是允許您選擇B樹或哈希作為索引的儲存引擎。

1. B樹指數特徵

B樹索引可以在使用表達式中使用的對列的比較=, >, >=, <, <=,或BETWEEN關鍵字。如果使用LIKE 或to LIKE且是一個不以通配符開頭的常數字串,則索引也可用於比較 。

1.例如,以下SELECT語句將使用索引:

SELECT * FROM tbl_name WHERE key_col LIKE &#39;Patrick%&#39;;
SELECT * FROM tbl_name WHERE key_col LIKE &#39;Pat%_ck%&#39;;

在第一個語句中'Patrick' <= key_col < 'Patricl',在第二個語句中' Pat' <= key_col < 'Pau'

2.以下SELECT語句不使用索引:

SELECT * FROM tbl_name WHERE key_col LIKE &#39;%Patrick%&#39;;
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=&#39;hello&#39;" */
WHERE index_part1=&#39;hello&#39; 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無論如何都會使用索引,因為它可以更快地找到在結果中返回幾行。

2. 哈希指數特徵

散列索引與剛才討論的特徵有些不同:

它們只用於使用=或< =>(文章結尾有此符號說明) 運算子的相等比較(但速度非常快)。它們不用於比較運算符,例如 <找到一系列值。依賴這種類型的單值查找的系統稱為“ 鍵值存儲 ” ; 要將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時,你需要一個一致的語句,此時就可以用<=>.

這篇文章到這裡就已經全部結束了,更多其他精彩內容可以關注PHP中文網的MySQL影片教學專欄!

以上是B樹和哈希索引的比較(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除