1、概述
在mysql中,索引(index)又叫鍵(key),它是存儲引擎用於快速找到所需記錄的一種數據結構。在愈來愈大的表中,索引是對查詢性能優化最有效的手段,索引對性能影響很是
關鍵。另外,mysql的索引是在存儲引擎層實現,而不是在服務器層。
2、索引的工做原理
咱們知道,在看一本書某章的時候,首先咱們會查找目錄索引,找到對應的頁碼而後快速找到相應的內容。mysql索引也同樣,存儲引擎利用相似的方法使用索引,先在索引中找到
對應的值,而後根據匹配的索引記錄找到對應的數據行,而後返回結果。
例如,咱們想在一個10W條記錄表 table 中查詢name等於「張三」的數據行,select * from table where name ='張三'。那麼在沒有對name字段創建索引的狀況下,咱們
須要掃描全表也就是掃描10W條數據來找到這條數據;若是咱們爲name字段創建索引,咱們只須要查找索引,而後根據索引找到對應的數據行,只須要查找一條記錄,性能會獲得很
大的提升。
3、索引分類
索引按照實現方式不一樣能夠分爲 B-Tree索引、hash索引、空間數據索引以及全文索引等。若是沒有特別指明,多半用的是B-Tree索引,B-Tree 對索引列是順序存儲的,所以很
適合查找範圍數據。它可以加快訪問數據的速度,由於存儲引擎再也不須要進行全表掃描來獲取須要的數據。
4、索引類型
索引主要分爲:單列索引(普通索引、主鍵索引、惟一索引)和組合索引。
普通索引:
CREATE INDEX name_Index ON `table`(`name`);
ALTER TABLE table ADD INDEX name_Index(`name`)
惟一索引:
CREATE UNIQUE INDEX id_UNIQUE_Index ON `table`(`id`);
主鍵索引:主鍵索引和惟一索引相似,惟一索引容許有空值,而主鍵索引不容許。
組合索引:通俗的說,組合索引就是一個表中一個索引包括多個字段,一個表中多個單列索引並非組合索引。
例如:
1
CREATE INDEX nickname_account_createdTime_Index ON `award`(`nickname`, `account`, `created_time`);
5、組合索引的查詢規則(什麼狀況下有效,什麼狀況下無效)
B-Tree 索引適用於全鍵值、鍵值範圍或鍵前綴查找,其中鍵前綴查找只適用於根據最左前綴查找。咱們創建表user(id,last_name,first_name, age ,birthday,sex),
創建組合索引 key(last_name, first_name, birthday),那麼它實際上包括三個索引(last_name),(last_name,first_name),
(last_name,first_name,birthday)。
下面咱們來分析組合索引有效以及無效的狀況,mysql在使用組合索引查詢的時候須要遵循「最左前綴」規則,什麼是「最左前綴」規則呢,就是在使用組合索引查詢,where的條件要
按照從左到右的順序,last_name first_name birthday,能夠是隻有last_name,或者包括last_name、first_name,或者last_name、first_name、birthday,這
個從左到右的順序不能變,也不能跳過;若是是直接first_name='ruby' 組合索引不生效,或者跳過first_name,last_name=‘allon’ and birthday = ‘2012’,組合
索引只有last_name生效,後面的全部不生效。
例如:1、全鍵值匹配:select * from user where last_name=‘allon’ and first_name='java' and birthday=‘2017-12'是生效的,
若是 select * from user where first_name='java' and birthday=‘2017-12'組合索引是不生效的,由於沒有key(first_name,birthday)的索引。
2、鍵前綴查找:select * from user where last_name=‘allon’;這個索引存在,也是有效的,但不能select * from user where first_name='java',這樣不生效。
3、like模糊查詢:好比只匹配組合索引第一列的值的開頭部分,查詢last_name姓張的人,select * from user where last_name like ‘張%’;
可是不能select * from user where last_name like ‘%張’;組合索引也沒法查找以張結尾的人。
再如 select * from user where last_name='allon' and first_name like '三%' and birthday = '2012-11-06',
由於first_name用了like這個範圍查詢條件,那麼查詢只用到了組合索引的前兩列,範圍查詢右面的列birthday沒法用索引優化查詢。
若是查詢中有某個列的範圍查詢,則該列右邊的全部列都沒法使用索引優化查找
4、匹配範圍值:select * from user where last_name between ’allon‘ and 'clitton';這裏只使用了組合索引的第一列,是生效的。
6、索引的優缺點
優勢:1、創建索引後,在查詢的時候合理利用索引可以提升數據庫性能;
2、主鍵索引 惟一索引能保證表中每一條數據的惟一性
3、減小分組和排序的時間
4、在錶鏈接的鏈接條件上使用索引,能夠加速表與表之間的相連。
缺點:1、建立索引和維護索引須要時間消耗;
2、索引文件佔用物理空間
3、當對錶的數據進行insert update delete時候須要維護索引,會下降數據的維護數據。