什么是MySQL索引

這篇文章給大家介紹什么是MySQL索引,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

元江縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

前言:

索引是MySQL數(shù)據(jù)庫中的重要對(duì)象之一,索引的目的在于提高查詢效率。可以類比字典中的目錄,查找字典內(nèi)容時(shí)可以根據(jù)目錄查找到數(shù)據(jù)的存放位置,然后直接獲取即可。索引是表的目錄,在查找內(nèi)容之前可以先在目錄中查找索引位置,以此快速定位查詢數(shù)據(jù)。需要說明的是,MySQL支持諸多存儲(chǔ)引擎,而各種存儲(chǔ)引擎對(duì)索引的支持也各不相同。為了避免混亂,本文將只關(guān)注于InnoDB引擎下的B+Tree索引。

1.索引結(jié)構(gòu)及原理

要想了解索引的原理,首先要知道索引的結(jié)構(gòu),下面簡(jiǎn)單介紹下B+Tree索引的結(jié)構(gòu)。

首先我們要知道索引是一種數(shù)據(jù)結(jié)構(gòu)。在InnoDB中,每個(gè)索引其實(shí)都是一顆B+樹,B+樹是為了磁盤及其他存儲(chǔ)輔助設(shè)備而設(shè)計(jì)的一種平衡查找樹(不是二叉樹),在B+樹中,所有的數(shù)據(jù)都在葉子節(jié)點(diǎn),且每一個(gè)葉子節(jié)點(diǎn)都帶有指向下一個(gè)節(jié)點(diǎn)的指針,形成了一個(gè)有序的鏈表。一般情況下數(shù)據(jù)庫的B+樹的高度一般在2~4層,這就是說找到某一鍵值的行記錄最多需要2到4次邏輯IO,下圖簡(jiǎn)單展示了B+樹索引的結(jié)構(gòu)。

什么是MySQL索引cdn.nlark.com/yuque/0/2020/png/119537/1589268320343-47af018e-3e88-4095-b2c0-50982eb373a6.png">

2.索引的分類及創(chuàng)建方法

在InnoDB中,表都是根據(jù)主鍵順序以索引的形式存放的,這種存儲(chǔ)方式的表稱為索引組織表。根據(jù)葉子節(jié)點(diǎn)的內(nèi)容,索引類型分為主鍵索引和非主鍵索引。主鍵索引的葉子節(jié)點(diǎn)存的是整行數(shù)據(jù)。在InnoDB里,主鍵索引也被稱為聚簇索引(clustered index)。非主鍵索引的葉子節(jié)點(diǎn)內(nèi)容是索引列和主鍵的值。在InnoDB里,非主鍵索引也被稱為二級(jí)索引(secondary index)或輔助索引

一張InnoDB表必須有一個(gè)聚簇索引,當(dāng)有主鍵時(shí),會(huì)以主鍵作為聚簇索引;如果沒有顯式定義主鍵,InnoDB會(huì)選擇一個(gè)唯一的非空索引代替。如果沒有這樣的索引,則MySQL自動(dòng)為InnoDB表生成一個(gè)隱含字段作為主鍵。除聚簇索引外的其他索引都可稱為二級(jí)索引,比如我們常用到的唯一索引、普通索引、聯(lián)合索引等。

上面講過聚簇索引的葉子節(jié)點(diǎn)存的是整行數(shù)據(jù),當(dāng)某條查詢使用的是聚簇索引時(shí),只需要掃描聚簇索引一顆B+樹即可得到所需記錄,如果想通過二級(jí)索引來查找完整的記錄的話,需要通過回表操作,也就是在通過二級(jí)索引找到主鍵值之后再到聚簇索引中查找完整的記錄。也就是說,基于非主鍵索引的查詢需要多掃描一棵索引樹。因此,我們?cè)趹?yīng)用中應(yīng)該盡量使用主鍵查詢。

下面介紹下索引的創(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='測(cè)試索引';
# 創(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;
3.索引的優(yōu)缺點(diǎn)及使用建議

索引的優(yōu)點(diǎn)顯而易見是可以加速查詢,但創(chuàng)建索引也是有代價(jià)的。首先每建立一個(gè)索引都要為它建立一棵B+樹,會(huì)占用額外的存儲(chǔ)空間;其次當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除、修改時(shí),索引也需要?jiǎng)討B(tài)的維護(hù),降低了數(shù)據(jù)的維護(hù)速度。所以,索引的創(chuàng)建及使用時(shí)有原則的,下面給出幾點(diǎn)索引使用的建議:

  • 顯式創(chuàng)建主鍵索引,建議使用自增ID作為主鍵。

  • 只為用于搜索、排序、分組、連接的列創(chuàng)建索引。

  • 對(duì)經(jīng)常更新的表避免創(chuàng)建過多的索引。

  • 建立聯(lián)合索引時(shí),可選擇性高的列放在前面。

  • 盡量不要在可選擇性差的列上建索引,如:性別、狀態(tài)列等。

  • 盡量使用覆蓋索引進(jìn)行查詢,避免回表帶來的性能損耗。(覆蓋索引包含要查詢的所有列)

  • select后面只寫查詢需要用到的字段,去掉不需要的字段。

  • 定位并刪除表中的重復(fù)和冗余索引。

關(guān)于什么是MySQL索引就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

本文題目:什么是MySQL索引
本文鏈接:http://bm7419.com/article24/goeoje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站制作電子商務(wù)、域名注冊(cè)、品牌網(wǎng)站制作App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)