MYSQL5.7 INDEXES之如何使用索引(一)

Most MySQL indexes (PRIMARY KEYUNIQUEINDEX, and FULLTEXT) are stored in B-trees. Exceptions: Indexes on spatial data types use R-trees; MEMORY tables also support hash indexesInnoDB uses inverted lists for FULLTEXT indexeshtml

B-Treenode

A tree data structure that is popular for use in database indexes. The structure is kept sorted at all times, enabling fast lookup for exact matches (equals operator) and ranges (for example, greater than, less than, and BETWEEN operators). This type of index is available for most storage engines, such as InnoDB and MyISAM.mysql

Because B-tree nodes can have many children, a B-tree is not the same as a binary tree, which is limited to 2 children per node.sql

Contrast with hash index, which is only available in the MEMORY storage engine. The MEMORY storage engine can also use B-tree indexes, and you should choose B-tree indexes for MEMORY tables if some queries use range operators.app

B樹索引:能夠在使用表達式中使用的對列的比較 =, >, >=, <, <=,或BETWEEN運營商。LIKE 若是to的參數LIKE是不以通配符開頭的常量字符串,則索引也能夠用於比較.less

哈希索引 :只能用來作相等比較,速度快。優化

MySQL使用索引進行如下操做:spa

  • WHERE快速 查找與子句匹配的行code

  • 從考慮中消除行。若是能夠在多個索引之間進行選擇,MySQL一般會使用找到最少行數的索引(最具 選擇性的索引)。htm

  • 若是表具備多列索引,則優化器可使用索引的任何最左前綴來查找行。舉例來講,若是你有一個三列的索引 (col1, col2, col3),你有索引的搜索功能(col1), (col1, col2)以及(col1, col2, col3)有關更多信息,請參見 第8.3.5節「多列索引」

  • 執行聯接時從其餘表中檢索行。若是聲明相同的類型和大小,MySQL能夠更有效地在列上使用索引。在這種狀況下, VARCHAR與 CHAR被認爲是相同的,若是它們被聲明爲相同的大小。例如, VARCHAR(10)和 CHAR(10)是相同的大小,可是 VARCHAR(10)和 CHAR(15)不是。

    對於非二進制字符串列之間的比較,兩個列應使用相同的字符集。例如,將一utf8列與一 latin1進行比較會排除使用索引。

    若是沒法在不進行轉換的狀況下直接比較值,則比較不一樣的列(例如,將字符串列與時間或數字列進行比較)可能會阻止使用索引。對於給定的值,如1在數值列,它可能比較等於在字符串列,例如任何數量的值 '1'' 1', '00001',或'01.e1'這排除了對字符串列使用任何索引的可能性。

  • 查找特定索引列MIN()或 MAX()key_col這由預處理器優化,該預處理器檢查您是否正在使用 索引中以前出現的全部關鍵部分在這種狀況下,MySQL對每一個表達式或 表達式進行一次鍵查找,並將其替換爲常量。若是全部表達式都用常量替換,查詢將當即返回。例如: WHERE key_part_N =constantkey_colMIN()MAX()

    SELECT MIN(key_part2),MAX(key_part2) FROM tbl_name WHERE key_part1=10;
  • 若是排序或分組是在可用索引的最左前綴(例如上完成的,則對錶進行排序或分組 若是全部關鍵部分後面都有,則按相反順序讀取密鑰。請參見 第8.2.1.14節「按優化排序」和 第8.2.1.15節「按優化分組」。 ORDER BY key_part1key_part2DESC

  • 在某些狀況下,能夠優化查詢以檢索值而無需查詢數據行。(爲查詢提供全部必要結果的索引稱爲 覆蓋索引。)若是查詢僅從表中使用某些索引中包含的列,則能夠從索引樹中檢索所選值,以提升速度:

    SELECT key_part3 FROM tbl_name WHERE key_part1=1

對於報表查詢處理大多數或全部行的小型表或大型表,索引的重要性不那麼重要。當查詢須要訪問大多數行時,順序讀取要比處理索引快。順序讀取能夠最大程度地減小磁盤查找,即便查詢不須要全部行。有關詳細信息請參見第8.2.1.20節「避免全表掃描」

相關文章
相關標籤/搜索