mysql常見索引概念

圖片來自http://www.ngchina.com.cn/

1. 什么是索引

索引就好比一本書的目錄滋将,它會(huì)讓你更快的找到內(nèi)容邻悬,但是目錄(索引)并不是越多越好,假如這本書1000頁随闽,有500也是目錄父丰,它當(dāng)然效率低,目錄是要占紙張的,而索引是要占磁盤空間的掘宪。

2. Mysql索引主要有兩種結(jié)構(gòu):

B+Tree索引和Hash索引.

  • Hash索引

MySQL中蛾扇,只有Memory(Memory表只存在內(nèi)存中,斷電會(huì)消失魏滚,適用于臨時(shí)表)存儲(chǔ)引擎顯示支持Hash索引镀首,是Memory表的默認(rèn)索引類型,盡管Memory表也可以使用B+Tree索引鼠次。hsah索引把數(shù)據(jù)的索引以hash形式組織起來更哄,因此當(dāng)查找某一條記錄的時(shí)候,速度非常快须眷。但因?yàn)槭莌ash結(jié)構(gòu)竖瘾,每個(gè)鍵只對(duì)應(yīng)一個(gè)值沟突,而且是散列的方式分布花颗。所以他并不支持范圍查找和排序等功能。

  • B+樹索引

B+tree是mysql使用最頻繁的一個(gè)索引數(shù)據(jù)結(jié)構(gòu)惠拭,是Inodb和Myisam存儲(chǔ)引擎模式的索引類型扩劝。相對(duì)Hash索引,B+樹在查找單條記錄的速度比不上Hash索引职辅,但是因?yàn)楦m合排序等操作棒呛,所以他更受用戶的歡迎。畢竟不可能只對(duì)數(shù)據(jù)庫進(jìn)行單條記錄的操作域携。

3. 選擇索引的數(shù)據(jù)類型

MySQL支持很多數(shù)據(jù)類型簇秒,選擇合適的數(shù)據(jù)類型存儲(chǔ)數(shù)據(jù)對(duì)性能有很大的影響。通常來說秀鞭,可以遵循以下一些指導(dǎo)原則:

  • 小的數(shù)據(jù)類型通常更好:越小的數(shù)據(jù)類型通常在磁盤趋观、內(nèi)存和CPU緩存中都需要更少的空間,處理起來更快锋边。
  • 簡(jiǎn)單的數(shù)據(jù)類型更好:整型數(shù)據(jù)比起字符皱坛,處理開銷更小,因?yàn)樽址谋容^更復(fù)雜豆巨。在MySQL中剩辟,應(yīng)該用內(nèi)置的日期和時(shí)間數(shù)據(jù)類型,而不是用字符串來存儲(chǔ)時(shí)間;以及用整型數(shù)據(jù)類型存儲(chǔ)IP地址贩猎。
  • 盡量避免NULL:應(yīng)該指定列為NOT NULL熊户,除非你想存儲(chǔ)NULL。在MySQL中吭服,含有空值的列很難進(jìn)行查詢優(yōu)化敏弃,因?yàn)樗鼈兪沟盟饕⑺饕慕y(tǒng)計(jì)信息以及比較運(yùn)算更加復(fù)雜噪馏。你應(yīng)該用0麦到、一個(gè)特殊的值或者一個(gè)空串代替空值。

4. 選擇主鍵類型

選擇合適的標(biāo)識(shí)符是非常重要的欠肾。選擇時(shí)不僅應(yīng)該考慮存儲(chǔ)類型瓶颠,而且應(yīng)該考慮MySQL是怎樣進(jìn)行運(yùn)算和比較的。一旦選定數(shù)據(jù)類型刺桃,應(yīng)該保證所有相關(guān)的表都使用相同的數(shù)據(jù)類型粹淋。

  • 整型:通常是作為標(biāo)識(shí)符的最好選擇,因?yàn)榭梢愿斓奶幚砩龋铱梢栽O(shè)置為AUTO_INCREMENT桃移。

  • 字符串:盡量避免使用字符串作為標(biāo)識(shí)符,它們消耗更好的空間葛碧,處理起來也較慢借杰。而且,通常來說进泼,字符串都是隨機(jī)的蔗衡,所以它們?cè)谒饕械奈恢靡彩请S機(jī)的,這會(huì)導(dǎo)致頁面分裂乳绕、隨機(jī)訪問磁盤绞惦,聚簇索引分裂(對(duì)于使用聚簇索引的存儲(chǔ)引擎)。

Mysql常見索引有:主鍵索引洋措、唯一索引济蝉、普通索引、全文索引菠发、組合索引

  • PRIMARY KEY(主鍵索引): ALTER TABLE table_name ADD PRIMARY KEY ( col )

  • UNIQUE(唯一索引): ALTER TABLE table_name ADD UNIQUE (col)

  • INDEX(普通索引): ALTER TABLE table_name ADD INDEX index_name (col)

  • FULLTEXT(全文索引): ALTER TABLE table_name ADD FULLTEXT ( col )

  • 組合索引: ALTER TABLE table_name ADD INDEX index_name (col1, col2, col3 )

Mysql各種索引區(qū)別:

  • 普通索引:最基本的索引王滤,沒有任何限制

普通索引(由關(guān)鍵字KEY或INDEX定義的索引)的唯一任務(wù)是加快對(duì)數(shù)據(jù)的訪問速度。因此雷酪,應(yīng)該只為那些最經(jīng)常出現(xiàn)在查詢條件(WHEREcolumn=)或排序條件(ORDERBYcolumn)中的數(shù)據(jù)列創(chuàng)建索引淑仆。只要有可能,就應(yīng)該選擇一個(gè)數(shù)據(jù)最整齊哥力、最緊湊的數(shù)據(jù)列(如一個(gè)整數(shù)類型的數(shù)據(jù)列)來創(chuàng)建索引蔗怠。

  • 唯一索引:與"普通索引"類似墩弯,不同的就是:索引列的值必須唯一,但允許有空值寞射。

普通索引允許被索引的數(shù)據(jù)列包含重復(fù)的值渔工。比如說,因?yàn)槿擞锌赡芡盼拢酝粋€(gè)姓名在同一個(gè)“員工個(gè)人資料”數(shù)據(jù)表里可能出現(xiàn)兩次或更多次引矩。

如果能確定某個(gè)數(shù)據(jù)列將只包含彼此各不相同的值,在為這個(gè)數(shù)據(jù)列創(chuàng)建索引的時(shí)候就應(yīng)該用關(guān)鍵字UNIQUE把它定義為一個(gè)唯一索引侵浸。這么做的好處:一是簡(jiǎn)化了MySQL對(duì)這個(gè)索引的管理工作旺韭,這個(gè)索引也因此而變得更有效率;二是MySQL會(huì)在有新記錄插入數(shù)據(jù)表時(shí)掏觉,自動(dòng)檢查新記錄的這個(gè)字段的值是否已經(jīng)在某個(gè)記錄的這個(gè)字段里出現(xiàn)過了区端;如果是,MySQL將拒絕插入那條新記錄澳腹。也就是說织盼,唯一索引可以保證數(shù)據(jù)記錄的唯一性。<u>事實(shí)上酱塔,在許多場(chǎng)合沥邻,人們創(chuàng)建唯一索引的目的往往不是為了提高訪問速度,而只是為了避免數(shù)據(jù)出現(xiàn)重復(fù)羊娃。</u>

  • 主鍵索引:它 是一種特殊的唯一索引唐全,不允許有空值。

必須為主鍵字段創(chuàng)建一個(gè)索引迁沫,這個(gè)索引就是所謂的“主索引”芦瘾。主索引與唯一索引的唯一區(qū)別是:前者在定義時(shí)使用的關(guān)鍵字是PRIMARY而不是UNIQUE。

  • 全文索引:僅可用于 MyISAM 表集畅,針對(duì)較大的數(shù)據(jù),生成全文索引很耗時(shí)耗空間缅糟。

MySql自帶的全文索引只能用于數(shù)據(jù)庫引擎為MYISAM的數(shù)據(jù)表挺智,如果是其他數(shù)據(jù)引擎,則全文索引不會(huì)生效窗宦。此外赦颇,MySql自帶的全文索引只能對(duì)英文進(jìn)行全文檢索,目前無法對(duì)中文進(jìn)行全文檢索赴涵。

  • 外鍵索引:

如果為某個(gè)外鍵字段定義了一個(gè)外鍵約束條件媒怯,MySQL就會(huì)定義一個(gè)內(nèi)部索引來幫助自己以最有效率的方式去管理和使用外鍵約束條件。

  • 組合索引:為了更多的提高mysql效率可建立組合索引髓窜,遵循”最左前綴“原則扇苞。創(chuàng)建復(fù)合索引時(shí)應(yīng)該將最常用(頻率)作限制條件的列放在最左邊欺殿,依次遞減。

索引可以覆蓋多個(gè)數(shù)據(jù)列鳖敷,如像INDEX(columnA脖苏,columnB)索引。這種索引的特點(diǎn)是MySQL可以有選擇地使用一個(gè)這樣的索引定踱。如果查詢操作只需要用到columnA數(shù)據(jù)列上的一個(gè)索引棍潘,就可以使用復(fù)合索引INDEX(columnA,columnB)。不過崖媚,這種用法僅適用于在復(fù)合索引中排列在前的數(shù)據(jù)列組合亦歉。比如說,INDEX(A畅哑,B鳍徽,C)可以當(dāng)做A或(A,B)的索引來使用,但不能當(dāng)做B敢课、C或(B阶祭,C)的索引來使用

組合索引最左字段用in是可以用到索引的,最好explain一下select直秆。

注:

explain顯示了MySQL如何使用索引來處理select語句以及連接表濒募。可以幫助選擇更好的索引和寫出更優(yōu)化的查詢語句圾结。簡(jiǎn)單講瑰剃,它的作用就是分析查詢性能。

explain關(guān)鍵字的使用方法很簡(jiǎn)單筝野,就是把它放在select查詢語句的前面晌姚。

mysql查看是否使用索引,簡(jiǎn)單的看type類型就可以歇竟。如果它是all挥唠,那說明這條查詢語句遍歷了所有的行,并沒有使用到索引焕议。

圖片

圖片參考地址

本文是整理多個(gè)mysql博客的筆記宝磨,總結(jié)出來的,主要是關(guān)于一些常見索引的概念介紹盅安。如果想深入理解還請(qǐng)自行查找文檔

時(shí):2018年7月5日

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唤锉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子别瞭,更是在濱河造成了極大的恐慌窿祥,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝙寨,死亡現(xiàn)場(chǎng)離奇詭異晒衩,居然都是意外死亡嗤瞎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門浸遗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猫胁,“玉大人,你說我怎么就攤上這事跛锌∑眩” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵髓帽,是天一觀的道長(zhǎng)菠赚。 經(jīng)常有香客問我,道長(zhǎng)郑藏,這世上最難降的妖魔是什么衡查? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮必盖,結(jié)果婚禮上拌牲,老公的妹妹穿的比我還像新娘。我一直安慰自己歌粥,他們只是感情好塌忽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著失驶,像睡著了一般土居。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嬉探,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天擦耀,我揣著相機(jī)與錄音,去河邊找鬼涩堤。 笑死眷蜓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的定躏。 我是一名探鬼主播账磺,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼痊远!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氏捞,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤碧聪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后液茎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逞姿,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辞嗡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滞造。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片续室。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谒养,靈堂內(nèi)的尸體忽然破棺而出挺狰,到底是詐尸還是另有隱情,我是刑警寧澤买窟,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布丰泊,位于F島的核電站,受9級(jí)特大地震影響始绍,放射性物質(zhì)發(fā)生泄漏瞳购。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一亏推、第九天 我趴在偏房一處隱蔽的房頂上張望学赛。 院中可真熱鬧,春花似錦吞杭、人聲如沸盏浇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缠捌。三九已至,卻和暖如春译蒂,著一層夾襖步出監(jiān)牢的瞬間曼月,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工柔昼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哑芹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓捕透,卻偏偏與公主長(zhǎng)得像聪姿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乙嘀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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