
1.相關(guān)概念
索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。索引的本質(zhì):索引是數(shù)據(jù)結(jié)構(gòu)。
2.普通索引
這是最基本的索引,它沒有任何限制,比如上文中為title字段創(chuàng)建的索引就是一個(gè)普通索引,MyIASM中默認(rèn)的BTREE類型的索引,也是我們大多數(shù)情況下用到的索引。
–直接創(chuàng)建索引
CREATE?INDEX?index_name?ON?table(column(length))
–修改表結(jié)構(gòu)的方式添加索引
ALTER?TABLE?table_name?ADD?INDEX?index_name?ON?(column(length))
–刪除索引
DROP?INDEX?index_name?ON?table
3.唯一索引
與普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值(注意和主鍵不同)。如果是組合索引,則列值的組合必須唯一,創(chuàng)建方法和普通索引類似。
–創(chuàng)建唯一索引
CREATE?UNIQUE?INDEX?indexName?ON?table(column(length))
–修改表結(jié)構(gòu)
ALTER?TABLE?table_name?ADD?UNIQUE?indexName?ON?(column(length))
4.全文索引
MySQL從3.23.23版開始支持全文索引和全文檢索,FULLTEXT索引僅可用于 MyISAM 表;他們可以從CHAR、VARCHAR或TEXT列中作為CREATE TABLE語(yǔ)句的一部分被創(chuàng)建,或是隨后使用ALTER TABLE 或CREATE INDEX被添加。對(duì)于較大的數(shù)據(jù)集,將你的資料輸入一個(gè)沒有FULLTEXT索引的表中,然后創(chuàng)建索引,其速度比把資料輸入現(xiàn)有FULLTEXT索引的速度更為快。不過切記對(duì)于大容量的數(shù)據(jù)表,生成全文索引是一個(gè)非常消耗時(shí)間非常消耗硬盤空間的做法。
–直接創(chuàng)建索引
CREATE?FULLTEXT?INDEX?index_content?ON?article(content)
–修改表結(jié)構(gòu)添加全文索引
ALTER?TABLE?article?ADD?FULLTEXT index_content(content)
5.單列索引、多列索引
多個(gè)單列索引與單個(gè)多列索引的查詢效果不同,因?yàn)閳?zhí)行查詢時(shí),MySQL只能使用一個(gè)索引,會(huì)從多個(gè)索引中選擇一個(gè)限制最為嚴(yán)格的索引。
6.組合索引(最左前綴)
用戶可以在多個(gè)列上建立索引,這種索引叫做復(fù)合索引(組合索引); 復(fù)合索引在數(shù)據(jù)庫(kù)操作期間所需的開銷更小,可以代替多個(gè)單一索引; 同時(shí)有兩個(gè)概念叫做窄索引和寬索引,窄索引是指索引列為1-2列的索引,寬索引也就是索引列超過2列的索引; 設(shè)計(jì)索引的一個(gè)重要原則就是能用窄索引不用寬索引,因?yàn)檎饕冉M合索引更有效;
7.MySQL索引失效的場(chǎng)景
1.數(shù)據(jù)類型是varchar,查詢時(shí)沒有使用引號(hào)括起時(shí)不會(huì)使用索引,此時(shí)索引失效
2.使用like時(shí)通配符在前:like '%xxxx'
3.在查詢條件中使用OR
4.對(duì)索引列進(jìn)行函數(shù)運(yùn)算
5.聯(lián)合索引ABC問題:Mysql從左到右的使用索引中的字段,一個(gè)查詢可以只使用索引中的一部份,但只能是最左側(cè)部分
6.使用索引中范圍條件右邊的列,范圍之后索引失效:< ,> between and
7.mysql使用不等于(!= 或者<>)的時(shí)候,無法使用索引,會(huì)導(dǎo)致索引失效
8.mysql中使用is not null 或者 is null會(huì)導(dǎo)致無法使用索引
9.如果mysql使用全表掃描要比使用索引快,則不會(huì)使用到索引
8.MySQL創(chuàng)建索引的原則
1、 對(duì)于查詢頻率高的字段創(chuàng)建索引;
2、 對(duì)排序、分組、聯(lián)合查詢頻率高的字段創(chuàng)建索引;
3、 索引的數(shù)目不宜太多
? ? ? 原因:a、每創(chuàng)建一個(gè)索引都會(huì)占用相應(yīng)的物理控件;
? ? ? ? ? b、過多的索引會(huì)導(dǎo)致insert、update、delete語(yǔ)句的執(zhí)行效率降低;
4、若在實(shí)際中,需要將多個(gè)列設(shè)置索引時(shí),可以采用多列索引
5、選擇唯一性索引
? ? ? ? 唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。例如,學(xué)生表中學(xué)號(hào)是具有唯一性的字段。為該字段建立唯一性索引可以很快的確定某個(gè)學(xué)生的信息。如果使用姓名的話,可能存在同名現(xiàn)象,從而降低查詢速度。
6、盡量使用數(shù)據(jù)量少的索引
? ? ? 如果索引的值很長(zhǎng),那么查詢的速度會(huì)受到影響。例如,對(duì)一個(gè)CHAR(100)類型的字段進(jìn)行全文檢索需要的時(shí)間肯定要比對(duì)CHAR(10)類型的字段需要的時(shí)間要多。
7、盡量使用前綴來索引
? ? 如果索引字段的值很長(zhǎng),最好使用值的前綴來索引。例如,TEXT和BLOG類型的字段,進(jìn)行全文檢索會(huì)很浪費(fèi)時(shí)間。如果只檢索字段的前面的若干個(gè)字符,這樣可以提高檢索速度。
8、刪除不再使用或者很少使用的索引.
表中的數(shù)據(jù)被大量更新,或者數(shù)據(jù)的使用方式被改變后,原有的一些索引可能不再需要。數(shù)據(jù)庫(kù)管理員應(yīng)當(dāng)定期找出這些索引,將它們刪除,從而減少索引對(duì)更新操作的影響