Mysql-索引的基础和类型
一、 ?索引的基礎(chǔ)
索引類(lèi)似于書(shū)籍的目錄,要想找到一本書(shū)的某個(gè)特定主題,需要先查找書(shū)的目錄,定位對(duì)應(yīng)的頁(yè)碼。
存儲(chǔ)引擎使用類(lèi)似的方式進(jìn)行數(shù)據(jù)查詢(xún),先去索引當(dāng)中找到對(duì)應(yīng)的值,然后根據(jù)匹配的索引找到對(duì)應(yīng)的數(shù)據(jù)行
二、 索引對(duì)性能的影響
優(yōu)點(diǎn):
1.大大減少服務(wù)器需要掃描的數(shù)據(jù)量
2.幫助服務(wù)器避免排序和臨時(shí)表
3.將隨機(jī) I/O 變順序 I/O
4.大大提高查詢(xún)速度
缺點(diǎn):
5.降低寫(xiě)的速度(在執(zhí)行寫(xiě)操作時(shí),會(huì)額外操作一遍索引)
6.占用磁盤(pán)
三、索引的使用場(chǎng)景
1.對(duì)于非常小的表,大部分情況下全表掃描效率會(huì)更高
2.對(duì)于中大型表來(lái)說(shuō),索引非常有效
3.特大型的表(上千萬(wàn),上億條數(shù)據(jù)),建立和使用索引的代價(jià)將會(huì)隨之增長(zhǎng),可以使用分區(qū)技術(shù)來(lái)解決
四、索引的類(lèi)型
1.普通索引:最基本的索引,沒(méi)有任何限制
2.唯一索引:與普通索引類(lèi)似,但是具有唯一性約束
3.主鍵索引:特殊的唯一索引,不允許有空值
4.組合索引:將多個(gè)列組合在一起創(chuàng)建索引,可以覆蓋多個(gè)列
5.外鍵索引:只有InnoDB的表才可以使用外鍵索引,保證數(shù)據(jù)的一致性,完整性,和實(shí)現(xiàn)級(jí)聯(lián)操作
6.全文索引:Mysql自帶的全文索引只能用于MYISAM,并且只能對(duì)英文進(jìn)行全文檢索
主鍵索引和唯一索引的區(qū)別:
1.主鍵索引一定是唯一索引,但唯一索引不一定是主鍵索引
2.一個(gè)表只能有一個(gè)主鍵索引,但可能有多個(gè)唯一索引
3.主鍵可以與外鍵構(gòu)成參照完整性約束,防止數(shù)據(jù)不一致
五、Mysql索引的創(chuàng)建原則
1.表的主鍵、外鍵必須有索引
2.主鍵盡可能選擇較短的數(shù)據(jù)類(lèi)型,可以有效減少磁盤(pán)的占用,提高查詢(xún)效率(比如int)
3.經(jīng)常與其他表進(jìn)行連接的表,在連接字段上應(yīng)該建立索引
4.經(jīng)常出現(xiàn)在Where子句中的字段,特別是大表的字段,應(yīng)該建立索引
5.索引應(yīng)該建在小字段上,對(duì)于大的文本字段甚至超長(zhǎng)字段,不要建索引
6.頻繁進(jìn)行數(shù)據(jù)操作的表,不要建立太多的索引
7.避免創(chuàng)建過(guò)多索引,索引會(huì)額外占用磁盤(pán)空間,降低寫(xiě)操作效率
8.對(duì)字符串進(jìn)行索引,應(yīng)該制定一個(gè)前綴長(zhǎng)度,可以節(jié)省大量的索引空間
9.復(fù)合索引的建立需要進(jìn)行仔細(xì)分析;盡量考慮用單字段索引代替
----復(fù)合索引建立原則:
1)復(fù)合索引的幾個(gè)字段是否經(jīng)常同時(shí)以AND方式出現(xiàn)在Where子句中?單字段查詢(xún)是否極少甚至沒(méi)有?如果是,則可以建立復(fù)合索引;否則考慮單字段索引
2)如果復(fù)合索引中包含的字段經(jīng)常單獨(dú)出現(xiàn)在Where子句中,則分解為多個(gè)單字段索引
3)如果復(fù)合索引所包含的字段超過(guò)3個(gè),那么仔細(xì)考慮其必要性,考慮減少?gòu)?fù)合的字段
六、一般選擇在這樣的列上創(chuàng)建索引
1.在經(jīng)常需要搜索查詢(xún)的列上創(chuàng)建索引,可以加快搜索的速度
2.在作為主鍵的列上創(chuàng)建索引,強(qiáng)制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu)
3.在經(jīng)常用在連接的列上創(chuàng)建索引,這些列主要是一些外鍵,可以加快連接的速度
4.在經(jīng)常需要根據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,其指定的范圍是連續(xù)的
5.在經(jīng)常需要排序的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,這樣查詢(xún)可以利用索引的排序,加快排序查詢(xún)時(shí)間
6.在經(jīng)常使用在Where子句中的列上面創(chuàng)建索引,加快條件的判斷速度
7.為經(jīng)常出現(xiàn)在關(guān)鍵字order by、group by、distinct后面的字段,建立索引
七、Mysql索引的注意事項(xiàng)
1.?限制表上的索引數(shù)目。對(duì)一個(gè)存在大量更新操作的表,所建索引的數(shù)目一般不要超過(guò)3個(gè),最多不要超過(guò)5個(gè)。索引雖說(shuō)提高了訪問(wèn)速度,但太多索引會(huì)影響數(shù)據(jù)的更新操作
2.?刪除不再使用,或者很少被使用的索引。表中的數(shù)據(jù)被大量更新,或者數(shù)據(jù)的使用方式被改變后,原有的一些索引可能不再被需要。數(shù)據(jù)庫(kù)管理員應(yīng)當(dāng)定期找出這些索引,將它們刪除,從而減少索引對(duì)更新操作的影響
3.對(duì)復(fù)合索引,按照字段在查詢(xún)條件中出現(xiàn)的頻度建立索引。在復(fù)合索引中,記錄首先按照第一個(gè)字段排序。對(duì)于在第一個(gè)字段上取值相同的記錄,系統(tǒng)再按照第二個(gè)字段的取值排序,以此類(lèi)推。因此只有復(fù)合索引的第一個(gè)字段出現(xiàn)在查詢(xún)條件中,該索引才可能被使用。因此將應(yīng)用頻度高的字段,放置在復(fù)合索引的前面,會(huì)使系統(tǒng)最大可能地使用此索引,發(fā)揮索引的作用。
4.like查詢(xún),%不能在前,否則索引會(huì)失效
一般情況下不鼓勵(lì)使用like操作,如果非使用不可,如何使用也是一個(gè)問(wèn)題。like “%aaa%” 不會(huì)使用索引而like “aaa%”可以使用索引
5.索引不會(huì)包含有NULL值的列
只要列中包含有NULL值都將不會(huì)被包含在索引中,復(fù)合索引中只要有一列含有NULL值,那么這一列對(duì)于此復(fù)合索引就是無(wú)效的。所以我們?cè)跀?shù)據(jù)庫(kù)設(shè)計(jì)時(shí)不要讓字段的默認(rèn)值為NULL。
總結(jié)
以上是生活随笔為你收集整理的Mysql-索引的基础和类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vi/vim 三种模式及命令 (简单粗
- 下一篇: Mysql的关联查询语句