文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  B 樹和雜湊索引的比較

10.3.9 B 樹和雜湊索引的比較

了解 B 樹和雜湊資料結構,有助於預測不同查詢在不同儲存引擎上的效能,這些儲存引擎在其索引中使用這些資料結構,特別是對於可讓您選擇 B 樹或雜湊索引的 MEMORY 儲存引擎而言。

B 樹索引特性

B 樹索引可用於使用 =>>=<<=BETWEEN 運算子的表示式中的欄位比較。如果 LIKE 的引數是不以萬用字元開頭的常數字串,索引也可以用於 LIKE 比較。例如,下列 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' 的列。

下列 SELECT 陳述式不會使用索引

SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;

在第一個陳述式中,LIKE 值以萬用字元開頭。在第二個陳述式中,LIKE 值不是常數。

如果您使用 ... LIKE '%字串%'字串 的長度超過三個字元,MySQL 會使用 Turbo Boyer-Moore 演算法 來初始化字串的模式,然後使用此模式更快地執行搜尋。

如果 欄位名稱 有建立索引,使用 欄位名稱 IS NULL 的搜尋會使用索引。

任何未跨越 WHERE 子句中所有 AND 層級的索引都不會被用於優化查詢。換句話說,為了能夠使用索引,索引的前綴必須在每個 AND 群組中使用。

以下 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;

這些 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 無法大約確定兩個值之間有多少個資料列(範圍最佳化工具會使用此值來決定要使用哪個索引)。如果您將 MyISAMInnoDB 表格變更為使用雜湊索引的 MEMORY 表格,這可能會影響某些查詢。

  • 只能使用完整的索引鍵來搜尋資料列。(對於 B 樹索引,可以使用索引鍵的任何最左前綴來尋找資料列。)