目錄
一、索引分類
? 1.按存儲引擎存儲形式分類??
? 1.1聚集索引
? ?1.1.1聚集索引結(jié)構(gòu)
? 1.2 二級索引
?1.2.1二級索引結(jié)構(gòu)
2.按數(shù)據(jù)庫分類
?2.1 主鍵索引?
?2.2 唯一索引
?2.3 常規(guī)索引
?2.4 聯(lián)合索引
?2.5 全文索引
上一期說到索引的原理其實就是B+樹,這期我們來聊一下索引的分類。
一、索引分類
? 1.按存儲引擎存儲形式分類??
? ?按存儲引擎存儲形式可以分為聚集索引和二級索引,這兩種索引也是索引的兩大類。
? 1.1聚集索引
? 將數(shù)據(jù)與索引存儲到一塊,索引結(jié)構(gòu)的葉子節(jié)點存儲行數(shù)據(jù)。聚集索引有且只能有一個,我們常說的主鍵就是聚集索引。
? 聚集索引的選取規(guī)則:
-
如果存在主鍵,那么主鍵就是聚集索引。
-
如果主鍵不存在,那么第一個唯一索引將作為聚集索引。
-
如果沒有唯一索引,存儲引擎Innodb將自動生成一個rowid作為隱藏的聚集索引。
? ?1.1.1聚集索引結(jié)構(gòu)
? ?可以看到葉子節(jié)點下分別都掛載了行數(shù)據(jù),這就是我們在上面所說的索引與數(shù)據(jù)存儲到一起,如下圖所示:
?? 執(zhí)行一條語句,來看下查找的過程是怎么樣的:
?select?* from?user where id='12';?
? 通過聚集索引,可以快速找到行數(shù)據(jù)。
? 1.2 二級索引
? ?將數(shù)據(jù)與索引分開存儲,索引結(jié)構(gòu)的葉子節(jié)點存儲的是對應(yīng)的主鍵。
? ?除了主鍵索引,其他都是二級索引,二級索引可以有多個。
? ?下面通過兩張圖來了解聚集索引和二級索引是如何存儲行數(shù)據(jù)和主鍵:
? 在最左邊我們可以看到有三列數(shù)據(jù),假設(shè)這張表為user,對應(yīng)的字段分別為id,name,gender,id作為主鍵,name字段添加了二級索引,我們先來看最上面的聚集索引:
?1.2.1二級索引結(jié)構(gòu)
??索引結(jié)構(gòu)的葉子節(jié)點存儲的是對應(yīng)的主鍵,如下圖所示:
? 當通過name作為條件去檢索數(shù)據(jù)時:
select * from user where?name='Arm';
??查詢過程如下:
-
第一步,通過Arm去檢索,Arm首先Lee進行對比,A小于L,往左走。
-
第二步,Arm再和Geek對比,A小于G,繼續(xù)往左走。
-
第三步,Arm等于Arm,再通過Arm下掛載的主鍵(10)去聚集索引下找。
-
最后找到主鍵10,主鍵10下掛載著對應(yīng)的行數(shù)據(jù)。
這就是通過二級索引去檢索的過程,相比于主鍵索引,二級索引的檢索出現(xiàn)了回表。
那么什么是回表呢?
回表就是通過二級索引找到主鍵值,再通過主鍵值找到行數(shù)據(jù)。
從上圖可以看出,二級索引的檢索效率會低于主鍵索引,那么如何解決回表的問題呢?我們在下期二級索引的使用中會說到。
2.按數(shù)據(jù)庫分類
? 按照數(shù)據(jù)庫可以分為主鍵索引、唯一索引、常規(guī)索引、聯(lián)合索引、全文索引。
? 除了主鍵索引為第1點所說的聚集索引,其他均為二級索引。
?2.1 主鍵索引?
? 即聚集索引。主鍵索引有且只有一個,關(guān)鍵字primary,主鍵索引是查詢效率最高的索引。
創(chuàng)建語法:
create primary index on table_name(column);
?2.2 唯一索引
? 唯一索引可以避免字段值不重復,可以有多個,關(guān)鍵字unique。
? 創(chuàng)建語法:
create unique?index on table_name(column);
?2.3 常規(guī)索引
? 我們常定義的索引只要不加上某個關(guān)鍵字都是常規(guī)索引。
? 創(chuàng)建語法:
create?index on table_name(column);
?2.4 聯(lián)合索引
? 一個索引創(chuàng)建在多個列上。
? 創(chuàng)建語法:
create?index on?table_name(column1,column2);
?2.5 全文索引
? 全文索引檢索的是文本中的關(guān)鍵字,而不是比較值,常用于海量數(shù)據(jù)的模糊查詢。
? 創(chuàng)建語法:
create fulltext?index on?table_name(column1,column2);
?全文索引的使用語法和其他不一樣,如上給column1,column2創(chuàng)建了全文索引。
?使用方法:
select * from?tale_name?where match(column1,column2) against('值1','值2');
match()函數(shù)指定的列和創(chuàng)建全文索引的列要完全匹配,否則會報錯,against匹配的為要查詢的值
? 總結(jié):
-
按存儲形式可將索引分為聚集索引和二級索引,聚集索引和二級索引的結(jié)構(gòu)及查詢的過程。
-
二級索引產(chǎn)生回表的問題.
-
按數(shù)據(jù)庫分類的5種索引及創(chuàng)建語法。
? ? 這一期索引分類、索引的存儲結(jié)構(gòu)分享到這里,我們下一期來聊索引的使用及如何解決回表的問題,下期見!文章來源:http://www.zghlxwxcb.cn/news/detail-815786.html
???公眾號:【積極向上的阿蟲】文章來源地址http://www.zghlxwxcb.cn/news/detail-815786.html
到了這里,關(guān)于MySQL查詢性能優(yōu)化——索引分類(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!