吐血總結(jié)——90%程序員面試都用得上的索引優(yōu)化手冊

目錄


多關(guān)于索引炊汤,分為以下幾點來講解:

  • 一劈伴、索引的概述(什么是索引,索引的優(yōu)缺點)
  • 二、索引的基本使用(創(chuàng)建索引)
  • 三镶柱、索引的基本原理(面試重點)
  • 四婆硬、索引的數(shù)據(jù)結(jié)構(gòu)(B樹,hash)
  • 五奸例、創(chuàng)建索引的原則(重中之重彬犯,面試必問!敬請收藏2榈酢)
  • 六谐区、百萬級別或以上的數(shù)據(jù)如何刪除

一、索引的概述


Ⅰ逻卖、什么是索引宋列?

索引是一種特殊的文件(InnoDB數(shù)據(jù)表上的索引是表空間的一個組成部分),它們包含著對數(shù)據(jù)表里所有記錄的引用指針评也。更通俗的說炼杖,索引就相當(dāng)于目錄。當(dāng)你在用新華字典時盗迟,幫你把目錄撕掉了坤邪,你查詢某個字開頭的成語只能從第一頁翻到第一千頁。累罚缕!把目錄還給你艇纺,則能快速定位!

Ⅱ邮弹、索引的優(yōu)缺點:

可以大大加快數(shù)據(jù)的檢索速度黔衡,這也是創(chuàng)建索引的最主要的原因。腌乡,且通過使用索引盟劫,可以在查詢的過程中,使用優(yōu)化隱藏器与纽,提高系統(tǒng)的性能侣签。但是,索引也是有缺點的:索引需要額外的維護(hù)成本渣锦;因為索引文件是單獨存在的文件,對數(shù)據(jù)的增加,修改,刪除,都會產(chǎn)生額外的對索引文件的操作,這些操作需要消耗額外的IO,會降低增/改/刪的執(zhí)行效率硝岗。

二、索引的基本使用


創(chuàng)建索引:(三種方式)

第一種方式

第二種方式:使用ALTER TABLE命令去增加索引:

ALTER TABLE用來創(chuàng)建普通索引袋毙、UNIQUE索引或PRIMARY KEY索引。

其中table_name是要增加索引的表名冗尤,column_list指出對哪些列進(jìn)行索引听盖,多列時各列之間用逗號分隔胀溺。

索引名index_name可自己命名,缺省時皆看,MySQL將根據(jù)第一個索引列賦一個名稱仓坞。另外,ALTER TABLE允許在單個語句中更改多個表腰吟,因此可以在同時創(chuàng)建多個索引无埃。

第三種方式:使用CREATE INDEX命令創(chuàng)建

CREATE INDEX可對表增加普通索引或UNIQUE索引。(但是毛雇,不能創(chuàng)建PRIMARY KEY索引)

三嫉称、索引的基本原理


索引用來快速地尋找那些具有特定值的記錄。如果沒有索引灵疮,一般來說執(zhí)行查詢時遍歷整張表织阅。

索引的原理很簡單,就是把無序的數(shù)據(jù)變成有序的查詢

  1. 把創(chuàng)建了索引的列的內(nèi)容進(jìn)行排序
  2. 對排序結(jié)果生成倒排表
  3. 在倒排表內(nèi)容上拼上數(shù)據(jù)地址鏈
  4. 在查詢的時候震捣,先拿到倒排表內(nèi)容荔棉,再取出數(shù)據(jù)地址鏈,從而拿到具體數(shù)據(jù)

四蒿赢、索引的數(shù)據(jù)結(jié)構(gòu)


  • b樹
  • hash

Ⅰ.B樹索引

mysql通過存儲引擎取數(shù)據(jù)润樱,基本上90%的人用的就是InnoDB了,按照實現(xiàn)方式分羡棵,InnoDB的索引類型目前只有兩種:BTREE(B樹)索引和HASH索引祥国。B樹索引是Mysql數(shù)據(jù)庫中使用最頻繁的索引類型,基本所有存儲引擎都支持BTree索引晾腔。通常我們說的索引不出意外指的就是(B樹)索引(實際是用B+樹實現(xiàn)的舌稀,因為在查看表索引時,mysql一律打印BTREE灼擂,所以簡稱為B樹索引)

查詢方式

主鍵索引區(qū):PI(關(guān)聯(lián)保存的時數(shù)據(jù)的地址)按主鍵查詢,

普通索引區(qū):si(關(guān)聯(lián)的id的地址,然后再到達(dá)上面的地址)壁查。所以按主鍵查詢,速度最快

B+tree性質(zhì)

  1. n棵子tree的節(jié)點包含n個關(guān)鍵字,不用來保存數(shù)據(jù)而是保存數(shù)據(jù)的索引剔应。
  2. 所有的葉子結(jié)點中包含了全部關(guān)鍵字的信息睡腿,及指向含這些關(guān)鍵字記錄的指針,且葉子結(jié)點本身依關(guān)鍵字的大小自小而大順序鏈接峻贮。
  3. 所有的非終端結(jié)點可以看成是索引部分席怪,結(jié)點中僅含其子樹中的最大(或最小)關(guān)鍵字纤控。
  4. B+ 樹中挂捻,數(shù)據(jù)對象的插入和刪除僅在葉節(jié)點上進(jìn)行。
  5. B+樹有2個頭指針船万,一個是樹的根節(jié)點刻撒,一個是最小關(guān)鍵碼的葉節(jié)點骨田。

Ⅱ.哈希索引

簡要說下,類似于數(shù)據(jù)結(jié)構(gòu)中簡單實現(xiàn)的HASH表(散列表)一樣声怔,當(dāng)我們在mysql中用哈希索引時态贤,主要就是通過Hash算法(常見的Hash算法有直接定址法、平方取中法醋火、折疊法悠汽、除數(shù)取余法、隨機(jī)數(shù)法)芥驳,將數(shù)據(jù)庫字段數(shù)據(jù)轉(zhuǎn)換成定長的Hash值柿冲,與這條數(shù)據(jù)的行指針一并存入Hash表的對應(yīng)位置;如果發(fā)生Hash碰撞(兩個不同關(guān)鍵字的Hash值相同)晚树,則在對應(yīng)Hash鍵下以鏈表形式存儲姻采。當(dāng)然這只是簡略模擬圖。

五爵憎、創(chuàng)建索引的原則


索引雖好慨亲,但也不是無限制的使用,最好符合一下幾個原則

  1. 最左前綴匹配原則宝鼓,組合索引非常重要的原則刑棵,mysql會一直向右匹配直到遇到范圍查詢(>、<愚铡、between蛉签、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引沥寥,d是用不到索引的碍舍,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調(diào)整邑雅。
  2. 較頻繁作為查詢條件的字段才去創(chuàng)建索引
  3. 更新頻繁字段不適合創(chuàng)建索引
  4. 若是不能有效區(qū)分?jǐn)?shù)據(jù)的列不適合做索引列(如性別片橡,男女未知,最多也就三種淮野,區(qū)分度實在太低)
  5. 盡量的擴(kuò)展索引捧书,不要新建索引。比如表中已經(jīng)有a的索引骤星,現(xiàn)在要加(a,b)的索引经瓷,那么只需要修改原來的索引即可。
  6. 定義有外鍵的數(shù)據(jù)列一定要建立索引洞难。
  7. 對于那些查詢中很少涉及的列舆吮,重復(fù)值比較多的列不要建立索引。
  8. 對于定義為text、image和bit的數(shù)據(jù)類型的列不要建立索引歪泳。

六萝勤、百萬級別或以上的數(shù)據(jù)如何刪除


關(guān)于索引:由于索引需要額外的維護(hù)成本露筒,因為索引文件是單獨存在的文件,所以當(dāng)我們對數(shù)據(jù)的增加,修改,刪除,都會產(chǎn)生額外的對索引文件的操作,這些操作需要消耗額外的IO,會降低增/改/刪的執(zhí)行效率呐伞。所以,在我們刪除數(shù)據(jù)庫百萬級別數(shù)據(jù)的時候慎式,查詢MySQL官方手冊得知刪除數(shù)據(jù)的速度和創(chuàng)建的索引數(shù)量是成正比的伶氢。

  1. 所以我們想要刪除百萬數(shù)據(jù)的時候可以先刪除索引(此時大概耗時三分多鐘)
  2. 然后刪除其中無用數(shù)據(jù)(此過程需要不到兩分鐘)
  3. 刪除完成后重新創(chuàng)建索引(此時數(shù)據(jù)較少了)創(chuàng)建索引也非常快瘪吏,約十分鐘左右癣防。
  4. 與之前的直接刪除絕對是要快速很多,更別說萬一刪除中斷,一切刪除會回滾掌眠。那更是坑了蕾盯。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蓝丙,隨后出現(xiàn)的幾起案子级遭,更是在濱河造成了極大的恐慌,老刑警劉巖渺尘,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挫鸽,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸥跟,警方通過查閱死者的電腦和手機(jī)丢郊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來医咨,“玉大人枫匾,你說我怎么就攤上這事∧饣矗” “怎么了干茉?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惩歉。 經(jīng)常有香客問我等脂,道長,這世上最難降的妖魔是什么撑蚌? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任上遥,我火速辦了婚禮,結(jié)果婚禮上争涌,老公的妹妹穿的比我還像新娘粉楚。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布模软。 她就那樣靜靜地躺著伟骨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪燃异。 梳的紋絲不亂的頭發(fā)上携狭,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機(jī)與錄音回俐,去河邊找鬼逛腿。 笑死,一個胖子當(dāng)著我的面吹牛仅颇,可吹牛的內(nèi)容都是我干的单默。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忘瓦,長吁一口氣:“原來是場噩夢啊……” “哼搁廓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起耕皮,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤境蜕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后明场,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汽摹,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年苦锨,在試婚紗的時候發(fā)現(xiàn)自己被綠了逼泣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡舟舒,死狀恐怖拉庶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秃励,我是刑警寧澤氏仗,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站夺鲜,受9級特大地震影響皆尔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜币励,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一慷蠕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧食呻,春花似錦流炕、人聲如沸澎现。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剑辫。三九已至,卻和暖如春渠欺,著一層夾襖步出監(jiān)牢的瞬間妹蔽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工峻堰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留讹开,地道東北人盅视。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓捐名,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闹击。 傳聞我的和親對象是個殘疾皇子镶蹋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354