1. 程式人生 > >《深入淺出MySQL》讀書筆記四:索引的設計和使用

《深入淺出MySQL》讀書筆記四:索引的設計和使用

一、概述

所有的MySQL列型別都可以被索引,對相關列使用索引是提高SELECT效能的最佳途徑。

根據儲存引擎的不同,表的最大索引數和最大索引長度有所不同,每種儲存引擎對每個表至少支援16個索引,總索引長度至少為 256位元組。

MyISAM和InnoDB 使用  BTREE索引, MEMORY 支援 HASH索引和 BTREE索引。

二、基礎知識

常見的索引型別: 主鍵、普通索引、唯一索引、全文索引。

 

create index ind_name1 on test11(name1);  為表test11 的 name1列 建立名為 ind_name1的普通索引
show index from test11; 檢視 test11表中建立的索引
drop index ind_name1 on test11; 將 test11表中的 名為ind_name1的索引刪除

 一般為 select 語句的  where 條件涉及的列 建立索引

explain select * from test11 where name1 like '更%'; 使用 explain來檢視MySQL的執行計劃
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test11
   partitions: NULL
         type: index
possible_keys: ind_name1    -->可能使用的索引
          key: ind_name1    -->實際使用的索引
      key_len: 63
          ref: NULL
         rows: 1            -->掃描的行數
     filtered: 100.00
        Extra: Using where; Using index
1 row in set, 1 warning (0.00 sec)

三、設計索引的一些原則

1、為 where語句中的條件列 建立索引

2、根據列值的特性,建立唯一索引

3、部分(字首)索引:對於 字元數較多的列,比如 CHAR(200), 如果 字首的字元有較高的區分度,則可以 create index ind_ on table(column(20)),為 前20個字元建立 字首索引。  優點:節省索引空間;較短的索引磁碟IO較少,查詢速度更快,比較值也更快;索引快取中可以容納更多的值。

4、只保持所需的索引,不要建立過多的索引。

5、InnoDB儲存引擎的表,記錄預設會按照一定的順序儲存:如果有明確定義的主鍵,則按照主鍵順序儲存;沒有主鍵,但有唯一索引,則按照唯一索引的順序儲存;既沒有主鍵又沒有唯一索引,那麼表中會自動生成一個內部列,按照內部列的順序儲存。

所以,InnoDB表 建表時 需要指定主鍵,按照主鍵進行的訪問是 最快的。 InnoDB表的普通索引都會儲存主鍵的鍵值,所以主鍵要儘可能選擇  較短的  資料型別,可以有效減少磁碟佔用,提高快取效果。

四、BTREE索引和 HASH索引

HASH索引的特徵:只能用於使用 = 或 <=> 操作符的等式比較;優化器不能使用 HASH索引加速order by操作;MySQL不能確定在兩個值之間大約有多少行,會影響查詢效率。總的來說,就是 使用索引的條件比較嚴格。

BTREE索引:當使用 >、<、<=、>=、BETWEEN、!=、<>、LIKE 'pattern%',都可以使用相關列上的索引。