《深入淺出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%',都可以使用相關列上的索引。