來(lái)自公眾號(hào):非科班的科班
作者:黎杜
前言
上一篇總結(jié)了Mysql的鎖機(jī)制酱床,通過(guò)讀者的反映和閱讀量顯示,總體還是不錯(cuò)的趟佃,感興趣的可以閱讀一下[大廠面試官必問(wèn)的Mysql鎖機(jī)制扇谣。
寫(xiě)了那么多的Mysql文章昧捷,有讀者問(wèn)我是不是dba,工作真的需要掌握那么深嗎罐寨。我想說(shuō)的是:我是一名Java全職開(kāi)發(fā)人員不是dba靡挥。
假如你只滿(mǎn)足于日常的crud,你可以放棄這些底層的知識(shí)衩茸,可以不必學(xué)的那么深芹血,若是你想往高處走贮泞,這些底層的知識(shí)楞慈,是你必備的。
話(huà)不多說(shuō)啃擦,這一篇總結(jié)是講解Mysql的索引囊蓝,之前寫(xiě)過(guò)一篇關(guān)于索引的,主要是講解索引的底層的數(shù)據(jù)結(jié)構(gòu)B+tree[為了把mysql的索引底層原理講清楚令蛉,我把計(jì)算機(jī)翻了個(gè)底朝天]聚霜。
這一篇是講解Mysql中做使用到的「索引的種類(lèi)」,「索引正確使用的原則」珠叔、「怎么優(yōu)化索引」蝎宇、「以及兩種存儲(chǔ)引擎InnoDB和MyISAM索引的數(shù)據(jù)布局原理」。
索引種類(lèi)
在說(shuō)索引之前祷安,我們先來(lái)說(shuō)一說(shuō)什么是索引呢姥芥?對(duì)于索引個(gè)人的理解就是,索引是一種加快查詢(xún)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)汇鞭。
所以凉唐,索引就是一種數(shù)據(jù)結(jié)構(gòu),作用就是發(fā)揮這種數(shù)據(jù)結(jié)構(gòu)的作用霍骄,加快查詢(xún)的效率台囱,例如:InnoDB存儲(chǔ)引擎中使用的是就是B+tree這種數(shù)據(jù)結(jié)構(gòu)來(lái)組織索引。
Mysql中索引的種類(lèi)也不是很多读整,不同類(lèi)型的索引有不同的作用簿训,索引的作用相互之間也存在交叉關(guān)系,Mysql中索引主要分為以下幾類(lèi):
-
「主鍵索引」(
PRIMARY KEY
):主鍵索引一般都是在創(chuàng)建表的時(shí)候指定米间,「一個(gè)表只有一個(gè)主鍵索引」强品,特點(diǎn)是「唯一、非空」车伞。 -
「唯一索引」(
UNIQUE
):唯一索引具有的特點(diǎn)就是唯一性择懂,可以在創(chuàng)建表的時(shí)候指定,也可以在創(chuàng)建表后創(chuàng)建另玖。 -
「普通索引」(
INDEX
):普通索引唯一的作用就是加快查詢(xún)困曙。 -
「組合索引」(
INDEX
):組合索引是創(chuàng)建一個(gè)「多個(gè)字段的索引」表伦,這個(gè)概念是相對(duì)于上上面的單列索引而言,組合索引查詢(xún)遵循「最左前綴原則」慷丽。 -
「全文索引」(
FULLTEXT
):全文索引是針對(duì)一些大的「文本字段」創(chuàng)建的索引蹦哼,也稱(chēng)為「全文檢索」。 - 「聚簇索引」和「非聚簇索引」:聚簇索引和非聚簇索引的概念比上面的概念要大要糊,屬于包含和被包含的關(guān)系纲熏。例如:InnoDB中主鍵索引使用的就是聚簇索引。
若是你想查看一個(gè)表的所有索引锄俄,可以執(zhí)行下面的sql來(lái)查看:
show index from 表名
例如局劲,查看我自己的測(cè)試表里面的索引,如下圖所示奶赠,Key_name
表示索引的名字鱼填,Column_name
表示索引的字段。
上面大概的說(shuō)了主要索引的概念毅戈,下面詳細(xì)的介紹一下這幾大索引的特點(diǎn)和使用苹丸。
主鍵索引
主鍵索引在InnoDB存儲(chǔ)引擎中是最常見(jiàn)的索引類(lèi)型,一個(gè)表都會(huì)有一個(gè)主鍵索引苇经,它索引的字段不允許為空值赘理,并且唯一。
一般是在創(chuàng)建表的時(shí)候扇单,可以通過(guò)RIMARY KEY
指定主鍵索引商模,在InnoDB存儲(chǔ)引擎中,若是創(chuàng)建表的時(shí)候沒(méi)有主觀創(chuàng)建主鍵索引令花,Mysql就會(huì)看表中是否有唯一索引阻桅,有,就會(huì)指定「非空的唯一索引」為主鍵索引兼都;
沒(méi)有嫂沉,就會(huì)默認(rèn)生成一個(gè)6byte
空間的自動(dòng)增長(zhǎng)主鍵作為主鍵索引,可以通過(guò)select _rowid from 表名
查詢(xún)的是對(duì)應(yīng)的主鍵值.扮碧。
MyISAM儲(chǔ)存引擎是可以不存在主鍵索引趟章,MyISAM和InnoDB儲(chǔ)存數(shù)據(jù)的結(jié)構(gòu)方式還是有明顯的區(qū)別,這個(gè)后面篇章會(huì)詳細(xì)講解慎王。
唯一索引
唯一索引與主鍵索引的區(qū)別就是蚓土,唯一索引允許為空,若是在組合索引中赖淤,只要?jiǎng)?chuàng)建的列值是唯一的
唯一索引在實(shí)際中更多的是用來(lái)保證數(shù)據(jù)的唯一性蜀漆,假如你僅僅要數(shù)據(jù)能夠快速查詢(xún),你也可以使用普通索引咱旱,所以唯一索引重在體現(xiàn)它的唯一性确丢。
實(shí)際的業(yè)務(wù)場(chǎng)景绷耍,有些庫(kù)表字段要求唯一,就可以使用唯一索引鲜侥,創(chuàng)建唯一索引的方式有三種褂始。
(1)一個(gè)是在創(chuàng)建表的時(shí)候指定,如下sql:
CREATE TABLE user(
id INT PRIMARY KEY NOT NULL,
name VARCHAR(16) NOT NULL,
UNIQUE unique_name (name(10))
);
(2)也可以在表創(chuàng)建后創(chuàng)建描函,如下sql:
CREATE UNIQUE INDEX unique_name ON user(name(10))崎苗;
(3)通過(guò)修改表結(jié)構(gòu)創(chuàng)建,如下sql:
ALTER user ADD UNIQUE unique_name ON (name(10))
這里有一個(gè)細(xì)節(jié)要注意的是創(chuàng)建的name字段舀寓,指定的長(zhǎng)度是16字符胆数,而創(chuàng)建的索引的長(zhǎng)度制定的是10字符,因?yàn)橐矝](méi)有人的名字長(zhǎng)度會(huì)超過(guò)10個(gè)字符基公,所以減少索引長(zhǎng)度幅慌,能夠減少索引所占的空間的大小宋欺。
普通索引
普通索引的唯一作用就是加快數(shù)據(jù)的查詢(xún)轰豆,一般對(duì)查詢(xún)語(yǔ)句WHERE
和ORDER BY
后面的字段創(chuàng)建普通索引。
創(chuàng)建普通索引的方式也有三種齿诞,基本和創(chuàng)建唯一索引的方式一樣酸休,只是把關(guān)鍵字UNIQUE換成INDEX
,如下所示:
// 創(chuàng)建表的時(shí)候創(chuàng)建
CREATE TABLE user(
id INT PRIMARY KEY NOT NULL,
name VARCHAR(16) NOT NULL,
INDEX index_name (name(10))
);
// 創(chuàng)建表后創(chuàng)建
CREATE INDEX INDEX index_name ON user(name(10))祷杈;
// 修改表結(jié)構(gòu)創(chuàng)建
ALTER user ADD INDEX index_name ON (name(10))
若是想刪除索引斑司,可以通過(guò)執(zhí)行下面的sql進(jìn)行刪除索引:
DROP INDEX index_name ON user;
組合索引
組合索引即用多個(gè)字段創(chuàng)建一個(gè)索引,組合索引能夠避免「回表查詢(xún)」但汞,相對(duì)于多字段的單列索引宿刮,組合索引的查詢(xún)效率更高。
創(chuàng)建組合索引(聯(lián)合索引)的方式和上面創(chuàng)建普通索引的方式一樣私蕾,只不過(guò)字段的數(shù)目多了僵缺,如下sql創(chuàng)建:
// 其它方式和上面的一樣,這里就只列舉修改表結(jié)構(gòu)的方式創(chuàng)建
ALTER TABLE employee ADD INDEX name_age_sex (name(10),age,sex);
回表查詢(xún)
什么是回表查詢(xún)呢踩叭?回表查詢(xún)簡(jiǎn)單來(lái)說(shuō)「通過(guò)二級(jí)索引查詢(xún)數(shù)據(jù)磕潮,得不到完整的數(shù)據(jù)行,需要再次查詢(xún)主鍵索引來(lái)獲得數(shù)據(jù)行」容贝。
InnoDB存儲(chǔ)引擎中自脯,索引分為 「聚簇索引」和「二級(jí)索引」,主鍵索引就是聚簇索引斤富,其它的索引為二級(jí)索引膏潮。
聚簇索引中的葉子節(jié)點(diǎn)保存著完整的數(shù)據(jù)行,而二級(jí)索引的葉子節(jié)點(diǎn)并不是保存完整的數(shù)據(jù)行满力。
上面提到InnoDB表是一定要有主鍵索引的焕参,雖然索引占據(jù)空間屋谭,但是索引符合二分查找的算法,查找數(shù)據(jù)非常的快龟糕。
假設(shè)還是上面的employee表桐磁,里面有主鍵索引id,和普通的索引name讲岁,那么在InnoDB中就會(huì)存在兩棵B+Tree我擂,一棵是主鍵索引樹(shù):
在主鍵索引樹(shù)中的葉子節(jié)點(diǎn)存儲(chǔ)的是完整的數(shù)據(jù)行,另外一棵是name字段的二級(jí)索引樹(shù)缓艳,如下圖所示:
倘若你執(zhí)行這條sql:select name, age, sex from employee where id ='as';
就會(huì)先執(zhí)行二級(jí)索引的查詢(xún)校摩,當(dāng)查詢(xún)name='as'時(shí),得到主鍵為50阶淘,再根據(jù)主鍵查詢(xún)主鍵索引樹(shù)衙吩,得到完整的數(shù)據(jù)行,具體的執(zhí)行流程如下:
這個(gè)就是回表查詢(xún)溪窒,回表查詢(xún)會(huì)查詢(xún)兩次坤塞,這樣就會(huì)降低查詢(xún)的效率,為了避免回表查詢(xún)澈蚌,只查詢(xún)一次就能得到完整的數(shù)據(jù)呢摹芙?
索引覆蓋
常見(jiàn)的方式就是「建立組合索引(聯(lián)合索引)「進(jìn)行」索引覆蓋」,什么是索引覆蓋呢宛瞄?索引覆蓋就是「索引的葉子節(jié)點(diǎn)已經(jīng)包含了查詢(xún)的數(shù)據(jù)浮禾,沒(méi)必要再回表進(jìn)行查詢(xún)》莺梗」
假如我還是執(zhí)行如下sql:select name, age, sex from employee where name ='as'
;因?yàn)槠胀ㄋ饕挥衝ame字段才建立了索引盈电,這必然會(huì)導(dǎo)致回表查詢(xún)。
為了提高查詢(xún)效率杯活,就(name)「單列索引升級(jí)為聯(lián)合索引」(name, age, sex)
就不同了匆帚。
因?yàn)榻⒌穆?lián)合索引,在二級(jí)節(jié)點(diǎn)的葉子階段就會(huì)同時(shí)存在name, age, sex
三個(gè)的值轩猩,一次性就會(huì)獲得所需要的數(shù)據(jù)卷扮,這樣就避免了回表,但是所有的方案都不是完美的均践。
若是這個(gè)聯(lián)合索引哪一天某一個(gè)數(shù)據(jù)行的name值改變了或者age改變了晤锹,我就需要同時(shí)維護(hù)主鍵索引和聯(lián)合索引兩棵樹(shù),這樣的維護(hù)成本就高了彤委,性能開(kāi)銷(xiāo)也大了鞭铆。
相比之前數(shù)據(jù)的改變,我只需要維護(hù)主鍵索引即可,聯(lián)合索引的創(chuàng)建就導(dǎo)致了需要同時(shí)維護(hù)兩棵樹(shù)车遂,這樣就會(huì)影響插入封断、更新數(shù)據(jù)的操作,所以并沒(méi)有哪種方案是完美的舶担。
最左前綴原則
我們知道單列索引是按照索引列有序性的進(jìn)行組織B+Tree結(jié)構(gòu)的坡疼,聯(lián)合索引又是怎么組織B+Tree呢?
聯(lián)合索引其實(shí)也是按照創(chuàng)建索引的時(shí)候衣陶,最左邊的進(jìn)行最開(kāi)始的排序柄瑰,也就是「最左前綴原則」,比如一個(gè)表中有如下數(shù)據(jù):
name | age | sex |
---|---|---|
ad | 23 | 男 |
bc | 21 | 男 |
bc | 24 | 女 |
bc | 25 | 男 |
de | 21 | 女 |
如上圖所示剪况,對(duì)于聯(lián)合索引中name字段是放在最前面的教沾,所以name是完全有序的,但是age字段就不是有序的译断,只有當(dāng)name相同授翻,例如:name='bc'此時(shí)age字段的索引排序才是完全有序的。
所以你會(huì)發(fā)現(xiàn)孙咪,在聯(lián)合索引中你只有使用以下的規(guī)則的方式查詢(xún)才會(huì)使用到索引:
- name,age,sex
- name,age
- name
因?yàn)镸ysql的底層有查詢(xún)優(yōu)化器堪唐,會(huì)判斷sql執(zhí)行的時(shí)候若是使用全表掃描的效率比使用索引的效率更高,就會(huì)使用全表掃描该贾。
假如羔杨,我查詢(xún)的時(shí)候使用age>=23,sex='男';
兩個(gè)字段作為查詢(xún)條件,但是沒(méi)有使用name字段杨蛋,因?yàn)樵趎ame不知情的條件下,對(duì)于age是無(wú)序的理澎。
對(duì)于age>=23
條件可能在很多的name不同中都有符合條件的出現(xiàn)逞力,所以就沒(méi)有辦法使用索引,這也是索引實(shí)現(xiàn)的原因糠爬,一定要遵循「查找有序寇荧,充分的利用索引的有序性」。
假如你是分別在name执隧,age揩抡,sex
三個(gè)字段中分別建立三個(gè)單列索引,就相當(dāng)于建立三顆索引樹(shù)镀琉,那么它的查詢(xún)效率峦嗤,比我們使用一棵索引樹(shù)查詢(xún)效率就可想而知了。
有一種情況即使使用到了最左邊的name
字段也不會(huì)使用索引屋摔,例如:WHERE name like '%d%'烁设;
這種like條件的模糊查詢(xún)是會(huì)使索引失效。
我們可以這樣理解钓试,「查詢(xún)字符串也是遵循最左前綴原則的」装黑,字符串的查詢(xún)是對(duì)字符串里面的字符一個(gè)一個(gè)的匹配副瀑,「若是字符串最左邊為%表示一個(gè)不確定的字符串,那么是沒(méi)辦法利用到索引的有序性」恋谭。
但是若是修改為 :WHERE name like 'd%'糠睡;
就可以使用索引,因?yàn)樽钭筮叺淖址谴_定的疚颊,這種稱(chēng)為「匹配列前綴」铜幽。
實(shí)際業(yè)務(wù)場(chǎng)景中聯(lián)合索引的創(chuàng)建,「我們應(yīng)該把識(shí)別度比較高的字段放在前面串稀,提高索引的命中率除抛,充分的利用索引」。
索引下推
Mysql5.6
版本提出了索引下推的原則母截,「用于查詢(xún)優(yōu)化到忽,主要是用于like關(guān)鍵字的查詢(xún)的優(yōu)化」,什么是索引下推呢清寇?
下面通過(guò)演示來(lái)說(shuō)明一下他的概念喘漏,還是利用原來(lái)的employee測(cè)試表,假如我要執(zhí)行下面的sql進(jìn)行查詢(xún):SELECT * from user where name like '張%' and age=40华烟;
假如沒(méi)有索引下推翩迈,執(zhí)行的過(guò)程如下圖所示:
查詢(xún)會(huì)直接忽略age字段,將name查詢(xún)的張開(kāi)頭的id=5盔夜、id=7的結(jié)果返回給Mysql服務(wù)器负饲,再執(zhí)行兩次的回表查詢(xún)。
若是上面的查詢(xún)操作使用了索引下推喂链,執(zhí)行的過(guò)程如下:
Mysql會(huì)將查詢(xún)條件age=40的查詢(xún)條件傳遞給存儲(chǔ)引擎返十,再次過(guò)濾掉age=50的數(shù)據(jù)行,這樣回表的次數(shù)就變?yōu)榱艘淮瓮治ⅲ岣吡瞬樵?xún)效率洞坑。
總結(jié)起來(lái)索引下推就是在執(zhí)行sql查詢(xún)的時(shí)候,會(huì)將一部分的索引列的判斷條件傳遞給存儲(chǔ)引擎蝇率,由存儲(chǔ)引擎通過(guò)判斷是否符合條件迟杂,只有符合條件的數(shù)據(jù)才會(huì)返回給Mysql服務(wù)器。
全文索引
全文索引也稱(chēng)為全文檢索本慕,可以通過(guò)以下sql建立全文索引:ALTER TABLE employee ADD FULLTEXT fulltext_name(name);
或者CREATE INDEX
的方式創(chuàng)建排拷。
全文索引主要是針對(duì)CHAR
、VARCHAR
或TEXT
這種文本類(lèi)的字段有效间狂,有人說(shuō)不也可以使用like
關(guān)鍵字來(lái)查詢(xún)文本嗎攻泼。
普通索引(單列索引)的查詢(xún)只能加快字段內(nèi)容中最前面的字符串的檢索,若是對(duì)于多個(gè)單詞組成文本的查詢(xún)普通索引就無(wú)能為力了。
索引一經(jīng)創(chuàng)建就沒(méi)有辦法修改忙菠,若是想要修改索引何鸡,必須重建,可以使用以下sql來(lái)刪除索引:DROP INDEX fulltext_name ON employee;
聚簇索引和非聚簇索引
聚簇索引和非聚簇索引是相對(duì)于存儲(chǔ)引擎的概念牛欢,范圍比較大骡男,包含上面所提到的索引類(lèi)型。
「聚簇索引就是葉子節(jié)點(diǎn)中存儲(chǔ)的就是完整的行數(shù)據(jù)傍睹,索引和數(shù)據(jù)存儲(chǔ)在一起隔盛;而非聚簇索引的索引文件和數(shù)據(jù)文件是分開(kāi)的,所以查詢(xún)數(shù)據(jù)會(huì)多一次查詢(xún)」拾稳。
因此聚簇索引的查詢(xún)速度會(huì)快于非聚簇索引的查詢(xún)速度吮炕,在Mysql的存儲(chǔ)引擎中,「InnoDB支持聚簇索引访得,MyISAM不支持聚簇索引龙亲,MyISAM支持非聚簇索引」。
聚簇索引
下面我們來(lái)看看InnoDB中的聚簇索引悍抑,前面說(shuō)到InnoDB都會(huì)有一個(gè)主鍵鳄炉,該主鍵就是用于支持聚簇索引,聚簇索引結(jié)構(gòu)圖搜骡,大致如下圖所示:
InnoDB中適用于最好的主鍵選擇就是給出一個(gè)AUTO_INCREMENT
的列作為自增的主鍵拂盯,有的人可能會(huì)使用UUID
作為隨機(jī)主鍵。
因?yàn)樗饕S持有序性记靡,若是使用隨機(jī)的主鍵谈竿,主鍵的插入需要尋找合適的位置進(jìn)行放置,這樣維護(hù)主鍵索引樹(shù)的成本就會(huì)變得更高簸呈。
相反的榕订,自增主鍵,主鍵都是自增變大蜕便,在維護(hù)主鍵索引樹(shù)的成本就會(huì)變得更小,隨意應(yīng)該盡量避免隨機(jī)主鍵贩幻。
非聚簇索引
MyISAM使用的是非聚簇索引轿腺,新插入數(shù)據(jù)的時(shí)候,會(huì)按順序的寫(xiě)入的磁盤(pán)中丛楚,并且給每一行數(shù)據(jù)標(biāo)記一個(gè)行號(hào)族壳,從小逐漸增大。
當(dāng)MyISAM創(chuàng)建主鍵索引的時(shí)候趣些,形成的主鍵索引樹(shù)的結(jié)構(gòu)圖如下圖所示:
在主鍵索引中仿荆,數(shù)據(jù)也是非空且唯一,主鍵索引樹(shù)中存儲(chǔ)的是數(shù)據(jù)行的行號(hào),當(dāng)查詢(xún)數(shù)據(jù)的時(shí)候使用主鍵索引查詢(xún)需要查詢(xún)到行號(hào)拢操,然后通過(guò)行號(hào)獲取數(shù)據(jù)锦亦。
非主鍵索引和主鍵索引一樣葉子節(jié)點(diǎn)也是存儲(chǔ)著行號(hào),唯一的區(qū)別就是非主鍵索引不要求非空令境、唯一杠园。
我們可以通對(duì)比圖來(lái)對(duì)比一下「InnoDB(聚簇索引)」 和 「MyISAM(非聚簇索引)」 的索引數(shù)據(jù)布局,如下圖所示:
說(shuō)到這里相信應(yīng)該大家對(duì)于「InnoDB(聚簇索引)」 和 「MyISAM(非聚簇索引)」 有了非常清晰的認(rèn)識(shí)和理解舔庶,下面是來(lái)說(shuō)一說(shuō)索引的優(yōu)化抛蚁,這個(gè)也是和我們?nèi)粘i_(kāi)發(fā)最密切相關(guān)的。
索引原則和優(yōu)化
要正確的使用索引惕橙,就要正確的創(chuàng)建索引瞧甩,用索引正確的查詢(xún),不要使索引失效弥鹦,因此索引的設(shè)計(jì)和優(yōu)化的原則應(yīng)該遵循下面的幾個(gè)原則:
- 索引列不要在表達(dá)式中出現(xiàn)肚逸,這樣會(huì)導(dǎo)致索引失效。如:「SELECT ...... WHERE id+1=5」;
- 索引列不要作為函數(shù)的參數(shù)使用惶凝。
- 索引列盡量不要使用like關(guān)鍵字吼虎。如:「SELECT ...... WHERE name like '%d%'」;
- 數(shù)字型的索引列不要當(dāng)作字符串類(lèi)型進(jìn)行條件查詢(xún)。如:「SELECT ...... WHERE id = '35'」;
- 盡量不要在條件NOT IN苍鲜、<>思灰、!= 中使用索引。
- 在索引列的字段中不要出現(xiàn)NULL值混滔,NULL值會(huì)使索引失效洒疚,可以用特殊的字符比如空字符串' '或者0來(lái)代替NULL值。
- 聯(lián)合索引的查詢(xún)應(yīng)該遵循最左前綴原則坯屿。
- 一般對(duì)于區(qū)別性比較大的字段建立索引油湖,在聯(lián)合索引中區(qū)別性比較大(識(shí)別度比較高)放在最前面,提高索引的命中率领跛。
- 索引的大小要適度乏德,不易過(guò)大,避免索引的冗余吠昭。
總結(jié)
索引是我們工作經(jīng)常會(huì)使用到的數(shù)據(jù)查詢(xún)方式喊括,正確的使用索引可以大大提高查詢(xún)的效率。
- 一方面索引減少了索引服務(wù)器需要掃描的數(shù)據(jù)行的數(shù)量矢棚,將原來(lái)的全表掃描郑什,使用特定的數(shù)據(jù)結(jié)構(gòu),能夠快速的定位數(shù)據(jù)行蒲肋。
- 另一方面使用有序的索引蘑拯,避免了排序钝满,將原來(lái)的隨機(jī)的IO操作,變成了順序的IO操作申窘,執(zhí)行有序弯蚜。
但是索引也不是十全十美的,也有自己的缺點(diǎn)偶洋,不正確的使用索引熟吏,將會(huì)導(dǎo)致索引大量的占據(jù)空間,索引并非是越多越好玄窝,索引文件會(huì)越發(fā)的膨脹牵寺,這樣嚴(yán)重的影響查詢(xún)的性能。
對(duì)于插入恩脂、更新帽氓、刪除數(shù)據(jù),除了維護(hù)數(shù)據(jù)以外俩块,還要維護(hù)索引文件黎休,這樣也會(huì)影響這些操作的性能,但是對(duì)于查詢(xún)的頻率遠(yuǎn)高于更新和插入數(shù)據(jù)的業(yè)務(wù)場(chǎng)景玉凯,索引是再適合不過(guò)了势腮。