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日