9102年都快過完了,你還在亂加索引嗎

前言:

索引對(duì)于數(shù)據(jù)庫(kù)的意義重大螃宙。尤其是對(duì)于海量數(shù)據(jù)的大表蛮瞄。有索引和沒有索引的速度就像法拉利和三輪車。那么有這么好的工具谆扎,學(xué)習(xí)索引和使用索引那就變成了理所當(dāng)然的事情了挂捅。下面我就以MYSQL數(shù)據(jù)庫(kù)為例。介紹下索引的三個(gè)方面


什么是索引堂湖?為什么要用索引闲先?

索引其實(shí)也是一張表。它存儲(chǔ)的是索引的值和對(duì)應(yīng)表中的物理位置无蜂。他能幫助數(shù)據(jù)庫(kù)快速的找到想要找的數(shù)據(jù)饵蒂。不同的索引只是存儲(chǔ)的數(shù)據(jù)的特性不同。不同的索引引擎也只是存儲(chǔ)和搜索策略的不同酱讶。本質(zhì)上還是一張表退盯,會(huì)占磁盤空間或者內(nèi)存空間。
那么為什么要用索引呢泻肯?這個(gè)問題就像是在問用漢語(yǔ)詞典的時(shí)候?yàn)槭裁匆炔橐艄?jié)表或者部首檢字表渊迁?為什么要這么做呢?
因?yàn)榭欤?br> 沒有索引的表用起來就像是翻開漢語(yǔ)字典一頁(yè)頁(yè)的找你想找的字灶挟。效率太慢琉朽。

所以索引是我必須要使用的工具

(也有不適合使用索引的場(chǎng)景。后面會(huì)講)

怎么使用索引

使用索引之前稚铣,我們需要了解箱叁,MYSQL 有哪些索引
常見的索引類型有:主鍵索引 唯一索引 普通索引 全文索引 組合索引

  1. 主鍵索引:即主索引墅垮,根據(jù)主鍵pk_clolum(length)建立索引,不允許重復(fù)耕漱,不允許空值
ALTER TABLE 'table_name' ADD PRIMARY KEY pk_index('col')算色;
  1. 唯一索引:用來建立索引的列的值必須是唯一的,允許空值
ALTER TABLE 'table_name' ADD UNIQUE index_name('col')螟够;
  1. 普通索引:用表中的普通列構(gòu)建的索引灾梦,沒有任何限制
ALTER TABLE 'table_name' ADD INDEX index_name('col');
  1. 全文索引:用大文本對(duì)象的列構(gòu)建的索引
ALTER TABLE 'table_name' ADD FULLTEXT INDEX ft_index('col')妓笙;
  1. 組合索引:用多個(gè)列組合構(gòu)建的索引若河,這多個(gè)列中的值不允許有空值
ALTER TABLE 'table_name' ADD INDEX index_name('col1','col2','col3');

下面分別介紹下 5種索引的使用場(chǎng)景

  1. 主鍵索引應(yīng)該是最常見的索引寞宫,我們?cè)趧?chuàng)建表的時(shí)候一般都會(huì)創(chuàng)建主鍵萧福,并且打上主鍵索引。主鍵上會(huì)有非空性辈赋,唯一性鲫忍。常規(guī)的主鍵還會(huì)有自增性。當(dāng)我們?cè)趙here 條件中指定主鍵為搜索條件時(shí)炭庙,速度就會(huì)非常的快
  2. 唯一索引一般用于數(shù)據(jù)本身可以保證唯一饲窿,并且有經(jīng)常查詢又不常修改的數(shù)據(jù)煌寇。比如常見的用戶郵箱焕蹄,用戶手機(jī)號(hào),身份證阀溶,銀行卡等腻脏。唯一索引的。唯一索引的用處除了能提高查詢效率以外银锻。當(dāng)表里插入或修改的數(shù)據(jù)在索引中已經(jīng)出現(xiàn)過了永品,MYSQL就拒絕這一次修改或者插入。這樣就可以避免數(shù)據(jù)出現(xiàn)重復(fù)
  3. 普通索引的使用場(chǎng)景其實(shí)就是數(shù)據(jù)不適合使用唯一索引或者全文索引击纬。但是又經(jīng)常會(huì)作為條件來查詢或者排序鼎姐,這個(gè)時(shí)候就會(huì)用到普通索引。常見的會(huì)有排序的字段sort 或者用戶的姓名 name
  4. 全文索引對(duì)應(yīng)的場(chǎng)景比較單一更振。就是那種大段內(nèi)容存儲(chǔ)炕桨,還需要模糊查詢的。當(dāng)我使用LIKE '%xxxx%'的時(shí)候是不走索引的肯腕。解決方案就是全文索引献宫。不過需要注意的是模糊查詢帶有全文索引的字段就不能使用LIKE了。需要使用下面的語(yǔ)句來查詢
SELECT * FROM table_name MATCH(ft_index) AGAINST('查詢字符串');
  1. 組合索引我認(rèn)為是根據(jù)業(yè)務(wù)來实撒。比如一個(gè)查詢語(yǔ)句經(jīng)常執(zhí)行姊途。但是字段又不常修改涉瘾。可以使用組合索引捷兰。組合索引比起對(duì)多個(gè)字段加上單獨(dú)的索引來說立叛,更節(jié)約磁盤的空間。因?yàn)楸旧斫⑺饕蛯?duì)性能有壓力寂殉。建立一個(gè)組合索引三個(gè)字段囚巴,比分別建立三個(gè)字段的普通索引 開銷要小。

在組合索引這里展開一下友扰。
當(dāng)我們使用了組合索引的時(shí)候彤叉,就需要遵循最左前綴原則
什么是最左前綴原則呢?就是在設(shè)置符合索引的時(shí)候盡量在被設(shè)置索引的字段查詢范圍和使用頻次做一個(gè)排序村怪。比如A字段 比B字段的查詢范圍和頻次更高秽浇。就更應(yīng)該把A字段排到左邊。同理在編寫查詢語(yǔ)句的時(shí)候
也應(yīng)該遵循這個(gè)邏輯甚负。
這里假如 有聯(lián)合索引 (a,b,c)三個(gè)字段

SELECT * FROM table_name WHERE a=1;//索引有效
SELECT * FROM table_name WHERE b='xx';//索引無效
SELECT * FROM table_name WHERE a=1 AND b='xx';//索引有效
SELECT * FROM table_name WHERE b='xx' AND a=1;//索引有效
SELECT * FROM table_name WHERE a=1 AND c='hahahaha';//索引有效
SELECT * FROM table_name WHERE b='xx' AND c='hahahaha';//索引無效
SELECT * FROM table_name WHERE a=1 AND b='xx' AND c='hahahaha';//索引有效

所以結(jié)合上面的例子
可以簡(jiǎn)單的理解為當(dāng)創(chuàng)建(a,b,c)聯(lián)合索引時(shí)柬焕,相當(dāng)于創(chuàng)建了(a)單列索引,(a,b)聯(lián)合索引以及 (a,b,c)聯(lián)合索引
那么在編寫sql的時(shí)候就應(yīng)該往能使用索引的方式去靠
還有就是 在組合索引中字段不能有NULL值梭域。如果有NULL怎么查索引的都是無效的

索引的使用也是要講基本法的

什么場(chǎng)景不適合用索引斑举?

  1. 數(shù)據(jù)過少的表,不需要用索引病涨。因?yàn)閿?shù)據(jù)較少富玷,MYSQL會(huì)將數(shù)據(jù)讀到內(nèi)存里去,有點(diǎn)類似于緩存既穆。這樣查詢速度會(huì)非呈昱常快。不要使用索引
  2. 經(jīng)常增刪改的字段不要使用索引幻工。因?yàn)楸旧斫⑺饕途S護(hù)索引是有開銷的励两。如果經(jīng)常變化的字段加上索引會(huì)拖慢操作的效率
  3. 不常被作為條件的字段,不要使用索引囊颅。不作為條件的字段除了無法通過索引加速以外当悔,還占用磁盤空間。帶來了維護(hù)壓力

什么場(chǎng)景適合使用索引踢代?

  1. 首先當(dāng)然是主鍵索引盲憎。每個(gè)表都應(yīng)該有主鍵索引
  2. 經(jīng)常作為查詢條件在WHERE或者ORDER BY 語(yǔ)句中出現(xiàn)的列要建立索引
  3. 查詢中與其他表關(guān)聯(lián)的字段,外鍵關(guān)系建立索引
  4. 業(yè)務(wù)上要防止重復(fù)的字段奸鬓,應(yīng)該加上唯一索引
  5. 用于聚合函數(shù)的字段焙畔,比如 count(col) sum(col)。應(yīng)該建立索引

最后串远,很多朋友會(huì)問宏多,我加了索引儿惫,但是不知道sql到底有沒有用到索引。這個(gè)時(shí)候伸但,只需要拿出索引大殺器explain 在你的sql前面就可以了

explain工具

概要描述

  • id:選擇標(biāo)識(shí)符
  • select_type:表示查詢的類型肾请。
  • table:輸出結(jié)果集的表
  • partitions:匹配的分區(qū)
  • type:表示表的連接類型
  • possible_keys:表示查詢時(shí),可能使用的索引
  • key:表示實(shí)際使用的索引
  • key_len:索引字段的長(zhǎng)度
  • ref:列與索引的比較
  • rows:掃描出的行數(shù)(估算的行數(shù))
  • filtered:按表?xiàng)l件過濾的行百分比
  • Extra:執(zhí)行情況的描述和說明

結(jié)語(yǔ):

其實(shí)關(guān)于索引的知識(shí)點(diǎn)還有很多很多更胖,我也不是專業(yè)的DBA铛铁,只能說是在后端開發(fā)的角度去介紹下會(huì)經(jīng)常用到的東西。還有就是數(shù)據(jù)庫(kù)不同的引擎却妨,也不完全一樣饵逐。所以這篇文章算是拋磚引玉了,希望以前不太關(guān)注小伙伴能重視索引彪标,也就可以了倍权。
如果這篇文章對(duì)你有幫助的話,請(qǐng)點(diǎn)個(gè)贊捞烟。要是能加個(gè)關(guān)注就更好了薄声。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市题画,隨后出現(xiàn)的幾起案子默辨,更是在濱河造成了極大的恐慌,老刑警劉巖苍息,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缩幸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡档叔,警方通過查閱死者的電腦和手機(jī)桌粉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蒸绩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衙四,“玉大人,你說我怎么就攤上這事患亿〈福” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵步藕,是天一觀的道長(zhǎng)惦界。 經(jīng)常有香客問我,道長(zhǎng)咙冗,這世上最難降的妖魔是什么沾歪? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮雾消,結(jié)果婚禮上灾搏,老公的妹妹穿的比我還像新娘挫望。我一直安慰自己,他們只是感情好狂窑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布媳板。 她就那樣靜靜地躺著,像睡著了一般泉哈。 火紅的嫁衣襯著肌膚如雪蛉幸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天丛晦,我揣著相機(jī)與錄音奕纫,去河邊找鬼。 笑死烫沙,一個(gè)胖子當(dāng)著我的面吹牛若锁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斧吐,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼又固,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了煤率?” 一聲冷哼從身側(cè)響起仰冠,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蝶糯,沒想到半個(gè)月后洋只,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昼捍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年识虚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妒茬。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡担锤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乍钻,到底是詐尸還是另有隱情肛循,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布银择,位于F島的核電站多糠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浩考。R本人自食惡果不足惜夹孔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搭伤,春花似錦害捕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至佑菩,卻和暖如春盾沫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殿漠。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工赴精, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绞幌。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓蕾哟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親莲蜘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谭确,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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

  • 索引 數(shù)據(jù)庫(kù)中的查詢操作非常普遍逐哈,索引就是提升查找速度的一種手段 索引的類型 從數(shù)據(jù)結(jié)構(gòu)角度分 1.B+索引:傳統(tǒng)...
    一凡呀閱讀 2,920評(píng)論 0 8
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常问顷。 O...
    我想起個(gè)好名字閱讀 5,321評(píng)論 0 9
  • 一昂秃、MySQL優(yōu)化 MySQL優(yōu)化從哪些方面入手: (1)存儲(chǔ)層(數(shù)據(jù)) 構(gòu)建良好的數(shù)據(jù)結(jié)構(gòu)《耪可以大大的提升我們S...
    寵辱不驚丶?xì)q月靜好閱讀 2,438評(píng)論 1 8
  • MySQL性能調(diào)優(yōu) 索引 索引是什么 官方介紹索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)肠骆。筆者理解索引相當(dāng)于一本書...
    陳小陌丿閱讀 1,409評(píng)論 0 4
  • 標(biāo)題 列表 鏈接和圖片 引用 粗體和斜體 代碼引用 表格 小結(jié): 學(xué)習(xí)更多,可參考 Markdown 語(yǔ)法說明 (...
    Jay_Chen閱讀 228評(píng)論 0 0