mysql之索引

mysql的索引是存儲(chǔ)引擎實(shí)現(xiàn)的磕道,而不是服務(wù)層實(shí)現(xiàn)的,沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)入桂,不同的引擎支持的索引類型不太一樣也不一定支持所有的索引份名,即使同一種索引不同的引擎實(shí)現(xiàn)方式也不一定一樣

索引類型

B-Tree索引

最常見(jiàn)的一種索引,不同的引擎以不同的方式使用B-Tree(B+,T-Tree索引)租副,性能也各有不同坐慰,各有優(yōu)劣。

BTree對(duì)索引是按順序存儲(chǔ)的用僧,很適合查找范圍數(shù)據(jù)结胀,索引對(duì)多個(gè)值排序的依據(jù)是定義索引的時(shí)候列的順序可以使用BTree的索引查詢類型:全鍵值,鍵值范圍查詢责循,列前綴匹配糟港。BTree索引的劣勢(shì)必須最左列匹配,不能跳過(guò)中間的列院仿,如果某一個(gè)列有范圍匹配秸抚,則該列右邊的列的索引無(wú)法生效

哈希索引

只有memory引擎顯示支持哈希索引,哈希索引只能進(jìn)行精確匹配歹垫。哈希索引可以用來(lái)壓縮索引列的長(zhǎng)度如:一個(gè)url壓縮成一個(gè)64位的int大大減少索引字段的空間

全文索引

全文索引是用來(lái)匹配文本關(guān)鍵字的類似于搜索引擎

空間索引(R-Tree)

用來(lái)存儲(chǔ)地理位置信息的剥汤,不同于其他索引列,從各個(gè)維度用來(lái)進(jìn)行索引

其他索引(TokuDB的分形樹(shù))

一種新的數(shù)據(jù)結(jié)構(gòu)排惨,既有BTree的優(yōu)點(diǎn)吭敢,又避免了BTree的缺點(diǎn)

高性能索引

獨(dú)立索引

索引列不能是表達(dá)式的一部分,假設(shè) tablea 的列columa上有獨(dú)立的索引,則如下查詢:

select * from tablea where columna+1=333 ,不能使用該索引暮芭,因?yàn)?(columna+1) 為表達(dá)式省有,mysql無(wú)法自動(dòng)解析,查詢時(shí)盡量簡(jiǎn)化where語(yǔ)句谴麦,將索引列單獨(dú)放置到比較符號(hào)的一側(cè)

前綴索引和索引選擇性

有時(shí)候需要索引很長(zhǎng)的字符串蠢沿,這會(huì)使索引非常慢,一種辦法是受用哈希對(duì)字符串進(jìn)行瘦身匾效,有時(shí)候這種做法還不夠舷蟀,通常可以索引開(kāi)始的部分字符串而不是全部

多列索引

常見(jiàn)的錯(cuò)誤是為每個(gè)列創(chuàng)建索引或按錯(cuò)誤的順序創(chuàng)建多列索引面哼,再多個(gè)列上創(chuàng)建單獨(dú)的索引大多數(shù)情況下并不能提高mysql的性能j(5.0之后的索引合并策略野宜,一定程度上可以緩解),向下面的例子魔策,在film_id和actor_id上各有一個(gè)單列索引匈子,對(duì)于如下查詢都不是好的選擇: select film_id,actor_id from tableA where actor_id=1 or film_id=2

選擇合適的索引順序

在一個(gè)多列BTree索引中,索引列的順序意味著索引先按照最左列進(jìn)行排序闯袒,其次是第二列虎敦,等等游岳。一個(gè)經(jīng)驗(yàn)法則是將選擇性最高的列放到索引的最前列,但通常不如避免隨機(jī)I/O,和排序那么重要其徙∨咂龋可能還依賴于值得分布,和查詢的運(yùn)行頻率來(lái)調(diào)整索引列

聚簇索引

聚簇索引不是一種索引類型唾那,而是一種數(shù)據(jù)存儲(chǔ)的方式 访锻,具體的細(xì)節(jié)依賴其實(shí)現(xiàn)方式。 innodb會(huì)給主鍵生成聚簇索引闹获,如果主鍵不存在期犬,會(huì)將第一個(gè)非Null 的unique_key當(dāng)做聚簇索引,如果沒(méi)有unique_key則會(huì)生成一個(gè)隱藏的聚簇索引避诽,innodb中聚簇索引是和存放于葉節(jié)點(diǎn)當(dāng)中的龟虎。

  • 優(yōu)點(diǎn)
    可以把相關(guān)數(shù)據(jù)存放在一起,例如根據(jù)用戶Id來(lái)聚集數(shù)據(jù)茎用,這樣加載用戶數(shù)據(jù)的時(shí)候遣总,只需從磁盤讀取少數(shù)頁(yè)就到獲取到聚集的某個(gè)用戶的所有數(shù)據(jù)睬罗,否則可能導(dǎo)致每讀取一條數(shù)據(jù)轨功,發(fā)生一次磁盤IO
    數(shù)據(jù)訪問(wèn)速度更快,聚簇索引將數(shù)據(jù)和索引存放在一起容达,通常比非聚簇索引更快
    使用覆蓋索引掃描的查詢可以直接使用頁(yè)節(jié)點(diǎn)的中主鍵值
  • 缺點(diǎn)
    插入速度嚴(yán)重依賴于插入順序古涧,按照主鍵的順序插入,是加載數(shù)據(jù)到innodb中最快的方式花盐,如果不是按順序插入羡滑,最好加載完成后執(zhí)行一次optimize_table命令重新組織下表。
    更新聚簇索引列的代價(jià)很高算芯,強(qiáng)制被更新的行移動(dòng)到新的位置
    在插入新行或主鍵更新導(dǎo)致需要移動(dòng)行的時(shí)候柒昏,面臨也分裂(一行數(shù)據(jù)存儲(chǔ)到2個(gè)頁(yè)中)
    導(dǎo)致全表掃描變慢,特別是行比較稀疏的時(shí)候熙揍,或頁(yè)分裂導(dǎo)致數(shù)據(jù)不一致的時(shí)候
    innodb中主鍵遞增的插入职祷,可以避免隨機(jī)IO的發(fā)生,但是高并發(fā)的情況下卻會(huì)造成主鍵的上界熱點(diǎn)届囚,因?yàn)樗械牟迦攵及l(fā)生再這里有梆,如何解決?

覆蓋索引:

如果一個(gè)索引包含所有需要查詢的字段意系,也就沒(méi)必要再去查詢表了泥耀,則稱之為覆蓋索引,覆蓋索引是非常有用的工具蛔添,可以極大的提高性能痰催,因?yàn)樗饕谴嬖谟趦?nèi)存中(數(shù)據(jù)不一定兜辞,innodb因?yàn)榫鄞厮饕拇嬖冢琈yisam內(nèi)存中只存索引)

冗余和重復(fù)索引

1. 重復(fù)索引

重復(fù)索引是指完全相同(列順序陨囊,和索引類型都完全相同)的索引弦疮,mysql的主鍵限制和唯一限制是通過(guò)索引實(shí)現(xiàn)的,mysql允許創(chuàng)建重復(fù)索引蜘醋,但是通常沒(méi)有理由這么做胁塞。

2. 冗余索引

冗余索引和重復(fù)索引有一些不同,索引A,是索引(A,B)的冗余索引(兩者索引類型相同)压语;索引B不是索引(A,B)的索引啸罢。大部分時(shí)候不需要冗余索引,應(yīng)該擴(kuò)展已有的索引而不是胎食,新增加索引扰才,有時(shí)候也有例外,例如擴(kuò)展新的索引導(dǎo)致索引太大了厕怜,導(dǎo)致使用該索引的其他查詢性能問(wèn)題衩匣,例如

如果在整數(shù)列上存在一個(gè)索引,現(xiàn)在需要額外增加一個(gè)很長(zhǎng)的varchar列擴(kuò)展該索引粥航,那性能可能回急劇下降琅捏,特別是查詢把這個(gè)索引當(dāng)做覆蓋查詢或者表是myisam表而且有很多范圍查詢的時(shí)候(myisam前綴壓縮)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市递雀,隨后出現(xiàn)的幾起案子柄延,更是在濱河造成了極大的恐慌,老刑警劉巖缀程,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搜吧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡杨凑,警方通過(guò)查閱死者的電腦和手機(jī)滤奈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)撩满,“玉大人蜒程,你說(shuō)我怎么就攤上這事○信#” “怎么了搞糕?”我有些...
    開(kāi)封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)曼追。 經(jīng)常有香客問(wèn)我窍仰,道長(zhǎng),這世上最難降的妖魔是什么礼殊? 我笑而不...
    開(kāi)封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任驹吮,我火速辦了婚禮针史,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碟狞。我一直安慰自己啄枕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布族沃。 她就那樣靜靜地躺著频祝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脆淹。 梳的紋絲不亂的頭發(fā)上常空,一...
    開(kāi)封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音盖溺,去河邊找鬼漓糙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烘嘱,可吹牛的內(nèi)容都是我干的昆禽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蝇庭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼醉鳖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起遗契,我...
    開(kāi)封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辐棒,失蹤者是張志新(化名)和其女友劉穎病曾,沒(méi)想到半個(gè)月后牍蜂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泰涂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年鲫竞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逼蒙。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡从绘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出是牢,到底是詐尸還是另有隱情僵井,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布驳棱,位于F島的核電站批什,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏社搅。R本人自食惡果不足惜驻债,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一乳规、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧合呐,春花似錦暮的、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拆祈,卻和暖如春微猖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缘屹。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工凛剥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人轻姿。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓犁珠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親互亮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子犁享,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • 《高性能MySQL》&《MySQL技術(shù)內(nèi)幕 InnoDB存儲(chǔ)引擎》筆記 第一章 MySQL架構(gòu)與歷史 MySQL的...
    xiaogmail閱讀 12,776評(píng)論 0 39
  • 索引 數(shù)據(jù)庫(kù)中的查詢操作非常普遍炊昆,索引就是提升查找速度的一種手段 索引的類型 從數(shù)據(jù)結(jié)構(gòu)角度分 1.B+索引:傳統(tǒng)...
    一凡呀閱讀 2,939評(píng)論 0 8
  • 索引概述 索引即key 在存儲(chǔ)引擎層實(shí)現(xiàn),不同引擎工作方式不同 索引優(yōu)化--最好的查詢優(yōu)化手段威根,可提效幾個(gè)數(shù)量級(jí) ...
    PennLi閱讀 575評(píng)論 0 2
  • 引子 對(duì)于一條SQL凤巨,開(kāi)發(fā)同學(xué)最先關(guān)心的啥? 我覺(jué)得還不到這個(gè)SQL在數(shù)據(jù)庫(kù)的執(zhí)行過(guò)程洛搀,而是這條SQL是否能盡快的...
    大頭8086閱讀 2,634評(píng)論 2 14
  • 聚簇索引并不是一種單獨(dú)的索引類型敢茁,而是一種數(shù)據(jù)存儲(chǔ)方式。比如留美,InnoDB的聚簇索引使用B+Tree的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)...
    sherlock_6981閱讀 1,862評(píng)論 0 2