mysql索引工作原理、分類


一、概述

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時候需要維護索引,會降低數據的維護數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM