一、概述
在mysql中,索引(index)又叫鍵(key),它是存儲引擎用於快速找到所需記錄的一種數據結構。在越來越大的表中,索引是對查詢性能優化最有效的手段,索引對性能影響非常關鍵。另外,mysql的索引是在存儲引擎層實現,而不是在服務器層。
二、索引的工作原理
我們知道,在看一本書某章的時候,首先我們會查找目錄索引,找到對應的頁碼然后快速找到相應的內容。mysql索引也一樣,存儲引擎利用類似的方法使用索引,先在索引中找到對應的值,然后根據匹配的索引記錄找到對應的數據行,然后返回結果。
例如,我們想在一個10W條記錄表 table 中查詢name等於“張三”的數據行,select * from table where name ='張三'。那么在沒有對name字段建立索引的情況下,我們需要掃描全表也就是掃描10W條數據來找到這條數據;如果我們為name字段建立索引,我們只需要查找索引,然后根據索引找到對應的數據行,只需要查找一條記錄,性能會得到很大的提高。
三、索引分類
索引按照實現方式不同可以分為 B-Tree索引、hash索引、空間數據索引以及全文索引等。如果沒有特別指明,多半用的是B-Tree索引,B-Tree 對索引列是順序存儲的,因此很適合查找范圍數據。它能夠加快訪問數據的速度,因為存儲引擎不再需要進行全表掃描來獲取需要的數據。
四、索引類型
索引主要分為:單列索引(普通索引、主鍵索引、唯一索引)和組合索引。
普通索引:
CREATE INDEX name_Index ON `table`(`name`);
1
|
ALTER
TABLE
table
ADD
INDEX
name_Index(`
name
`)
|
唯一索引:
1
|
CREATE
UNIQUE
INDEX
id_UNIQUE_Index
ON
`
table
`(`id`);
|
主鍵索引:主鍵索引和唯一索引類似,唯一索引允許有空值,而主鍵索引不允許。
組合索引:通俗的說,組合索引就是一個表中一個索引包括多個字段,一個表中多個單列索引並不是組合索引。
例如:
1
|
CREATE
INDEX
nickname_account_createdTime_Index
ON
`award`(`nickname`, `account`, `created_time`);
|
五、組合索引的查詢規則(什么情況下有效,什么情況下無效)
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';這里只使用了組合索引的第一列,是生效的。
六、索引的優缺點
優點:1、建立索引后,在查詢的時候合理利用索引能夠提高數據庫性能;
2、主鍵索引 唯一索引能保證表中每一條數據的唯一性
3、減少分組和排序的時間
4、在表連接的連接條件上使用索引,可以加速表與表之間的相連。
缺點:1、創建索引和維護索引需要時間消耗;
2、索引文件占用物理空間
3、當對表的數據進行insert update delete時候需要維護索引,會降低數據的維護數據。