這篇文章給大家介紹什么是索引,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
前言:
索引是MySQL數據庫中的重要對象之一,索引的目的在于提高查詢(xún)效率??梢灶?lèi)比字典中的目錄,查找字典內容時(shí)可以根據目錄查找到數據的存放位置,然后直接獲取即可。索引是表的目錄,在查找內容之前可以先在目錄中查找索引位置,以此快速定位查詢(xún)數據。需要說(shuō)明的是,MySQL支持諸多存儲引擎,而各種存儲引擎對索引的支持也各不相同。為了避免混亂,本文將只關(guān)注于InnoDB引擎下的B+Tree索引。
要想了解索引的原理,首先要知道索引的結構,下面簡(jiǎn)單介紹下B+Tree索引的結構。
首先我們要知道索引是一種數據結構。在InnoDB中,每個(gè)索引其實(shí)都是一顆B+樹(shù),B+樹(shù)是為了磁盤(pán)及其他存儲輔助設備而設計的一種平衡查找樹(shù)(不是二叉樹(shù)),在B+樹(shù)中,所有的數據都在葉子節點(diǎn),且每一個(gè)葉子節點(diǎn)都帶有指向下一個(gè)節點(diǎn)的指針,形成了一個(gè)有序的鏈表。一般情況下數據庫的B+樹(shù)的高度一般在2~4層,這就是說(shuō)找到某一鍵值的行記錄最多需要2到4次邏輯IO,下圖簡(jiǎn)單展示了B+樹(shù)索引的結構。
在InnoDB中,表都是根據主鍵順序以索引的形式存放的,這種存儲方式的表稱(chēng)為索引組織表。根據葉子節點(diǎn)的內容,索引類(lèi)型分為主鍵索引和非主鍵索引。主鍵索引的葉子節點(diǎn)存的是整行數據。在InnoDB里,主鍵索引也被稱(chēng)為聚簇索引
(clustered index)。非主鍵索引的葉子節點(diǎn)內容是索引列和主鍵的值。在InnoDB里,非主鍵索引也被稱(chēng)為二級索引
(secondary index)或輔助索引
一張InnoDB表必須有一個(gè)聚簇索引,當有主鍵時(shí),會(huì )以主鍵作為聚簇索引;如果沒(méi)有顯式定義主鍵,InnoDB會(huì )選擇一個(gè)唯一的非空索引代替。如果沒(méi)有這樣的索引,則MySQL自動(dòng)為InnoDB表生成一個(gè)隱含字段作為主鍵。除聚簇索引外的其他索引都可稱(chēng)為二級索引,比如我們常用到的唯一索引、普通索引、聯(lián)合索引等。
上面講過(guò)聚簇索引的葉子節點(diǎn)存的是整行數據,當某條查詢(xún)使用的是聚簇索引時(shí),只需要掃描聚簇索引一顆B+樹(shù)即可得到所需記錄,如果想通過(guò)二級索引來(lái)查找完整的記錄的話(huà),需要通過(guò)回表操作,也就是在通過(guò)二級索引找到主鍵值之后再到聚簇索引中查找完整的記錄。也就是說(shuō),基于非主鍵索引的查詢(xún)需要多掃描一棵索引樹(shù)。因此,我們在應用中應該盡量使用主鍵查詢(xún)。
下面介紹下索引的創(chuàng )建、刪除等操作方法。
# 建表時(shí)指定索引 CREATE TABLE `t_index` ( `increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主鍵', `col1` int(11) NOT NULL, `col2` varchar(20) NOT NULL, `col3` varchar(50) NOT NULL, `col4` int(11) NOT NULL, PRIMARY KEY (`increment_id`), UNIQUE KEY `uk_col1` (`col1`), KEY `idx_col2` (`col2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='測試索引'; # 創(chuàng )建索引(兩種方法) # 普通索引 alter table `t_index` add index idx_col3 (col3); create index idx_col3 on t_index(col3); # 唯一索引 alter table `t_index` add unique index uk_col4 (col4); create unique index uk_col4 on t_index(col4); # 聯(lián)合索引 alter table `t_index` add index idx_col3_col4 (col3,col4); create index idx_col3_col4 on t_index(col3,col4); # 刪除索引 alter table `t_index` drop index uk_col4; DROP INDEX idx_col3_col4 on t_index;
索引的優(yōu)點(diǎn)顯而易見(jiàn)是可以加速查詢(xún),但創(chuàng )建索引也是有代價(jià)的。首先每建立一個(gè)索引都要為它建立一棵B+樹(shù),會(huì )占用額外的存儲空間;其次當對表中的數據進(jìn)行增加、刪除、修改時(shí),索引也需要動(dòng)態(tài)的維護,降低了數據的維護速度。所以,索引的創(chuàng )建及使用時(shí)有原則的,下面給出幾點(diǎn)索引使用的建議:
顯式創(chuàng )建主鍵索引,建議使用自增ID作為主鍵。
只為用于搜索、排序、分組、連接的列創(chuàng )建索引。
對經(jīng)常更新的表避免創(chuàng )建過(guò)多的索引。
建立聯(lián)合索引時(shí),可選擇性高的列放在前面。
盡量不要在可選擇性差的列上建索引,如:性別、狀態(tài)列等。
盡量使用覆蓋索引進(jìn)行查詢(xún),避免回表帶來(lái)的性能損耗。(覆蓋索引包含要查詢(xún)的所有列)
select后面只寫(xiě)查詢(xún)需要用到的字段,去掉不需要的字段。
定位并刪除表中的重復和冗余索引。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站