Mysql高級之索引優(yōu)化(三)

Mysql官方對索引的定義是:索引(Index)是幫助Mysql高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)价捧。

可以得到索引的本質(zhì):索引是一種數(shù)據(jù)結(jié)構(gòu)策州。

為什么要建索引吃嘿?

索引的目的在于提高查詢效率。

比如:如果要查“mysql”這個單詞币叹,我們肯定需要定位到m字母姨拥,然后從下往下找到y(tǒng)字母绅喉,再找到剩下的sql。

如果沒有索引叫乌,那么你可能需要a----z柴罐,會使查找效率變慢。

索引也可以理解為:排好序的快速查找數(shù)據(jù)結(jié)構(gòu)憨奸。

索引有兩大功能:查找快革屠,排好序。也即建的索引將會影響到Sql的兩部分排宰。

第一部分:就是where條件后面這部分的條件約束是否用到索引似芝,這部分就是負責(zé)查找的條件過濾。

第二部分:索引會影響到where后面的查找以及order by后面的排序板甘。

在數(shù)據(jù)本身之外党瓮,數(shù)據(jù)庫系統(tǒng)還維護著滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù)盐类,這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)上實現(xiàn)高級查找算法寞奸。這種數(shù)據(jù)結(jié)構(gòu),就是索引在跳。下圖就是一種可能的索引方式示例:

左邊是數(shù)據(jù)表枪萄,一共有兩列七條記錄,最左邊的是數(shù)據(jù)記錄的物理地址 為了加快Col2的查找硬毕,可以維護一個右邊所示的二叉查找樹呻引,每個節(jié)點分別包含索引鍵值和一個指向?qū)?yīng)數(shù)據(jù)記錄物理地址的指針礼仗,這樣就可以運用二叉查找在一定的復(fù)雜度內(nèi)獲取到相應(yīng)數(shù)據(jù)吐咳,從而快速的檢索出符合條件的記錄逻悠。

索引的優(yōu)勢:

類似大學(xué)圖書館中建書目的索引,提高數(shù)據(jù)檢索的效率韭脊,降低了數(shù)據(jù)庫的IO成本童谒。

通過對索引列對數(shù)據(jù)進行排序,降低數(shù)據(jù)排序的成本沪羔,降低了CPU的消耗饥伊。

索引的劣勢:

實際上索引也是一張表,該表保存了主鍵與索引的字段蔫饰,并指向?qū)嶓w表的記錄琅豆,所以索引列也是要占用空間的。

雖然索引大大的提高了查詢的效率篓吁,同時卻會降低更新表的速度茫因,如對表進行inser,update以及detele。因為更新表時杖剪,Mysql不僅要保存數(shù)據(jù)冻押,還要保存一下索引文件每次更新添加了索引列的字段,都會調(diào)整因為更新所帶來的鍵值變化后的索引信息盛嘿。

索引只是提高查詢效率的一個因素洛巢,如果有大數(shù)據(jù)量的表,就需要花時間研究建立最優(yōu)秀的索引或優(yōu)化查詢語句次兆。

索引分類和建索引語句:

1.單值索引:即一個索引只包含單個列稿茉,一個表可以有多個單列索引。

2.唯一索引:索引列的值必須唯一芥炭,但允許有空值狈邑。

3.復(fù)合索引:即一個索包含多個列。

基本的語句:

如果建的是唯一索引蚤认,那么就加UNIQUE這個關(guān)鍵字米苹,不加就可以省略。

如果是CHAR VARCHAR類型砰琢,length可以小于字段的實際長度蘸嘶。如果是BLOB和TEXT類型,必須指定length陪汽。

如果columnname(length)寫了多個训唱,那么就是復(fù)合索引。

第一種建法:

1.CREATE [UNIQUE] INDEX indexName ON mytable(columnname(length));//單值索引?

2.ALTER mytable ADD [UNIQUE] INDEX [indexName] ON (columnname(length))? //單值索引

刪除索引:

3.DROP INDEX [indexName]ON mytable;? //意思就是把某個表中的某個索引給刪了

查看索引:

4.SHOW INDEX FROM Table_name\G;

有四種方式來添加數(shù)據(jù)表的索引:

1.ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵挚冤,這意味著索引值必須是唯一的况增,且不能為NULL。

2.ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句創(chuàng)建索引的值必須是唯一的(除了NULL外训挡,NULL可能會出現(xiàn)多次)澳骤。

3.ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引歧强,索引值可出現(xiàn)多次。

4.ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引為 FULLTEXT 为肮,用于全文索引摊册。

Java開發(fā)相關(guān)的Mysql索引結(jié)構(gòu):

BTree索引:

【初始化介紹】 一顆b+樹,淺藍色的塊我們稱之為一個磁盤塊颊艳,可以看到每個磁盤塊包含幾個數(shù)據(jù)項(深藍色所示)和指針(黃色所示)茅特,如磁盤塊1包含數(shù)據(jù)項17和35,包含指針P1棋枕、P2白修、P3,P1表示小于17的磁盤塊重斑,P2表示在17和35之間的磁盤塊熬荆,P3表示大于35的磁盤塊。真實的數(shù)據(jù)存在于葉子節(jié)點即3绸狐、5卤恳、9、10寒矿、13突琳、15、28符相、29拆融、36、60啊终、75镜豹、79、90蓝牲、99趟脂。非葉子節(jié)點只不存儲真實的數(shù)據(jù),只存儲指引搜索方向的數(shù)據(jù)項例衍,如17昔期、35并不真實存在于數(shù)據(jù)表中。

【查找過程】如果要查找數(shù)據(jù)項29佛玄,那么首先會把磁盤塊1由磁盤加載到內(nèi)存硼一,此時發(fā)生一次IO,在內(nèi)存中用二分查找確定29在17和35之間梦抢,鎖定磁盤塊1的P2指針般贼,內(nèi)存時間因為非常短(相比磁盤的IO)可以忽略不計,通過磁盤塊1的P2指針的磁盤地址把磁盤塊3由磁盤加載到內(nèi)存,發(fā)生第二次IO哼蛆,29在26和30之間蕊梧,鎖定磁盤塊3的P2指針,通過指針加載磁盤塊8到內(nèi)存人芽,發(fā)生第三次IO,同時內(nèi)存中做二分查找找到29绩脆,結(jié)束查詢萤厅,總計三次IO。

真實的情況是靴迫,3層的b+樹可以表示上百萬的數(shù)據(jù)惕味,如果上百萬的數(shù)據(jù)查找只需要三次IO,性能提高將是巨大的玉锌,如果沒有索引名挥,每個數(shù)據(jù)項都要發(fā)生一次IO,那么總共需要百萬次的IO主守,顯然成本非常非常高禀倔。

以下索引了解即可。

Hash索引

full-text全文索引

R-Tree索引

哪些情況下適合建索引参淫?

1.主鍵自動建立唯一索引救湖。

2.頻繁作為查詢條件的字段應(yīng)該建索引。

3.查詢中與其他表關(guān)聯(lián)的字段涎才,外鍵關(guān)系建立索引鞋既。

4.頻繁更新的字段不適合創(chuàng)建索引:因為每次更新不單單只是更新了記錄,還會更新索引耍铜,加重了IO負擔(dān)邑闺。

5.Where條件里用不到的字段不創(chuàng)建索引。

6.單鍵/組合索引的選擇問題(高并發(fā)下傾向創(chuàng)建組合索引)棕兼。

7.查詢中排序的字段陡舅,排序字段若通過索引去訪問將大大提高排序速度。

8.查詢中統(tǒng)計或者分組字段伴挚。

哪些情況下不適合建索引蹭沛?

1.表記錄太少。

2.經(jīng)常增刪改的表:提高了查詢效率章鲤,但是同時卻會降低了更新表的速度摊灭,如對表進行INSERT,UPDATE以及DELETE。因為更新表時败徊,MySql不僅要保存數(shù)據(jù)帚呼,還要保存索引文件。

3.數(shù)據(jù)重復(fù)并且分布平均的表字段,因此應(yīng)該只給最經(jīng)常查詢和最經(jīng)常排序的數(shù)據(jù)列建立索引煤杀,但如果某個數(shù)據(jù)列包含許多重復(fù)的內(nèi)容眷蜈,為它建立索引就沒有太大的實際效果。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沈自,一起剝皮案震驚了整個濱河市酌儒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枯途,老刑警劉巖忌怎,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酪夷,居然都是意外死亡榴啸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門晚岭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸥印,“玉大人,你說我怎么就攤上這事坦报】馑担” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵片择,是天一觀的道長璃弄。 經(jīng)常有香客問我,道長构回,這世上最難降的妖魔是什么夏块? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮纤掸,結(jié)果婚禮上脐供,老公的妹妹穿的比我還像新娘。我一直安慰自己借跪,他們只是感情好政己,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掏愁,像睡著了一般歇由。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上果港,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天沦泌,我揣著相機與錄音,去河邊找鬼辛掠。 笑死谢谦,一個胖子當(dāng)著我的面吹牛释牺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播回挽,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼没咙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了千劈?” 一聲冷哼從身側(cè)響起祭刚,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎墙牌,沒想到半個月后涡驮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡憔古,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年遮怜,在試婚紗的時候發(fā)現(xiàn)自己被綠了淋袖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸿市。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖即碗,靈堂內(nèi)的尸體忽然破棺而出焰情,到底是詐尸還是另有隱情,我是刑警寧澤剥懒,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布内舟,位于F島的核電站,受9級特大地震影響初橘,放射性物質(zhì)發(fā)生泄漏验游。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一保檐、第九天 我趴在偏房一處隱蔽的房頂上張望耕蝉。 院中可真熱鬧,春花似錦夜只、人聲如沸垒在。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽场躯。三九已至,卻和暖如春旅挤,著一層夾襖步出監(jiān)牢的瞬間踢关,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工粘茄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耘成,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像瘪菌,于是被迫代替她去往敵國和親撒会。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容