mysql的索引設(shè)計(jì)原則以及經(jīng)常見(jiàn)索引的區(qū)別的容易說(shuō)明
發(fā)表時(shí)間:2023-09-03 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]下面小編就為大家?guī)?lái)一篇淺談mysql的索引設(shè)計(jì)原則以及常見(jiàn)索引的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧索引定義:是一個(gè)單獨(dú)的,存儲(chǔ)在磁盤(pán)上的數(shù)據(jù)庫(kù)結(jié)構(gòu),其包含著對(duì)數(shù)據(jù)表里所有記錄的引用指針.數(shù)據(jù)庫(kù)索引的設(shè)計(jì)原則:為了使索引的使用效率更高,在創(chuàng)建索引時(shí),...
下面小編就為大家?guī)?lái)一篇淺談
mysql的
索引設(shè)計(jì)原則以及常見(jiàn)索引的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
索引定義:是一個(gè)單獨(dú)的,存儲(chǔ)在磁盤(pán)上的數(shù)據(jù)庫(kù)結(jié)構(gòu),其包含著對(duì)數(shù)據(jù)表里所有記錄的引用指針.
數(shù)據(jù)庫(kù)索引的設(shè)計(jì)原則:
為了使索引的使用效率更高,在創(chuàng)建索引時(shí),必須考慮在哪些字段上創(chuàng)建索引和創(chuàng)建什么類(lèi)型的索引。
那么索引設(shè)計(jì)原則又是怎樣的?
1.選擇唯一性索引
唯一性索引的值是唯一的,可以更快速的通過(guò)該索引來(lái)確定某條記錄。
例如,學(xué)生表中學(xué)號(hào)是具有唯一性的字段。為該字段建立唯一性索引可以很快的確定某個(gè)學(xué)生的信息。
如果使用姓名的話,可能存在同名現(xiàn)象,從而降低查詢(xún)速度。
2.為經(jīng)常需要排序、分組和聯(lián)合操作的字段建立索引
經(jīng)常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作會(huì)浪費(fèi)很多時(shí)間。
如果為其建立索引,可以有效地避免排序操作。
3.為常作為查詢(xún)條件的字段建立索引
如果某個(gè)字段經(jīng)常用來(lái)做查詢(xún)條件,那么該字段的查詢(xún)速度會(huì)影響整個(gè)表的查詢(xún)速度。因此,
為這樣的字段建立索引,可以提高整個(gè)表的查詢(xún)速度。
4.限制索引的數(shù)目
索引的數(shù)目不是越多越好。每個(gè)索引都需要占用磁盤(pán)空間,索引越多,需要的磁盤(pán)空間就越大。
修改表時(shí),對(duì)索引的重構(gòu)和更新很麻煩。越多的索引,會(huì)使更新表變得很浪費(fèi)時(shí)間。
5.盡量使用數(shù)據(jù)量少的索引
如果索引的值很長(zhǎng),那么查詢(xún)的速度會(huì)受到影響。例如,對(duì)一個(gè)CHAR(100)類(lèi)型的字段進(jìn)行全文
檢索需要的時(shí)間肯定要比對(duì)CHAR(10)類(lèi)型的字段需要的時(shí)間要多。
6.盡量使用前綴來(lái)索引
如果索引字段的值很長(zhǎng),最好使用值的前綴來(lái)索引。例如,TEXT和BLOG類(lèi)型的字段,進(jìn)行全文檢索
會(huì)很浪費(fèi)時(shí)間。如果只檢索字段的前面的若干個(gè)字符,這樣可以提高檢索速度。
7.刪除不再使用或者很少使用的索引
表中的數(shù)據(jù)被大量更新,或者數(shù)據(jù)的使用方式被改變后,原有的一些索引可能不再需要。數(shù)據(jù)庫(kù)管理
員應(yīng)當(dāng)定期找出這些索引,將它們刪除,從而減少索引對(duì)更新操作的影響。
8.小表不應(yīng)建立索引;包含大量的列并且不需要搜索非空值的時(shí)候可以考慮不建索引
----------------------------------------------------------
mysql索引相關(guān)小常識(shí):
一、 經(jīng)常被用來(lái)過(guò)濾記錄的字段。
1. primary key 字段, 系統(tǒng)自動(dòng)創(chuàng)建主鍵的索引;
2. unique key 字段,系統(tǒng)自動(dòng)創(chuàng)建對(duì)應(yīng)的索引;
3. foreign key 約束所定義的作為外鍵的字段;
4. 在查詢(xún)中用來(lái)連接表的字段;
5. 經(jīng)常用來(lái)作為排序(order by 的字段)基準(zhǔn)的字段;
二、索引會(huì)占用磁盤(pán)空間,創(chuàng)建不必要的索引只會(huì)形成浪費(fèi)。
三、索引的創(chuàng)建必須考慮數(shù)據(jù)的操作方式。
1.內(nèi)容很少變動(dòng),經(jīng)常被查詢(xún),為它多創(chuàng)建幾個(gè)索引無(wú)所謂;
2.經(jīng)常性,例行性變動(dòng)的表而言,則需要謹(jǐn)慎地創(chuàng)建確實(shí)必要的索引;
四、primary key 和 unique key的區(qū)別
1. 作為Primary Key的域/域組不能為null。而Unique Key可以。
2. 在一個(gè)表中只能有一個(gè)Primary Key,而多個(gè)Unique Key可以同時(shí)存在。
更大的區(qū)別在邏輯設(shè)計(jì)上, Primary Key一般在邏輯設(shè)計(jì)中用作記錄標(biāo)識(shí),這也是設(shè)置
Primary Key的本來(lái)用意, 而Unique Key只是為了保證域/域組的唯一性。
五、復(fù)合索引和單一索引
復(fù)合索引是指多字段聯(lián)合索引,查詢(xún)時(shí)經(jīng)常需要這幾個(gè)字段組合一起為條件再查詢(xún)
唯一索引主要是用主鍵ID索引,存儲(chǔ)結(jié)構(gòu)順序與物理結(jié)構(gòu)一致
如:create index idx on tbl(a,b)
先按a排序, a相同的按b排序,所以當(dāng)你查a或ab的時(shí)候,
能夠利用到這個(gè)索引.但當(dāng)你只查b的時(shí)候,索引對(duì)你的幫助不大.可能可以跳躍查找.
---------------------------------------------
添加和刪除索引的情況:
1、表的主鍵、外鍵必須有索引;
2、數(shù)據(jù)量超過(guò)300w的表應(yīng)該有索引;
3、經(jīng)常與其他表進(jìn)行連接的表,在連接字段上應(yīng)該建立索引;
4、經(jīng)常出現(xiàn)在Where子句中的字段,特別是大表的字段,應(yīng)該建立索引;
5、索引應(yīng)該建在選擇性高的字段上;
6、索引應(yīng)該建在小字段上,對(duì)于大的文本字段甚至超長(zhǎng)字段,不要建索引;
7、復(fù)合索引的建立需要進(jìn)行仔細(xì)分析;盡量考慮用單字段索引代替:
A、正確選擇復(fù)合索引中的主列字段,一般是選擇性較好的字段;
B、復(fù)合索引的幾個(gè)字段是否經(jīng)常同時(shí)以AND方式出現(xiàn)在Where子句中?單字段查詢(xún)是否極少甚至沒(méi)有?如果是,則可以建立復(fù)合索引;否則考慮單字段索引;
C、如果復(fù)合索引中包含的字段經(jīng)常單獨(dú)出現(xiàn)在Where子句中,則分解為多個(gè)單字段索引;
D、如果復(fù)合索引所包含的字段超過(guò)3個(gè),那么仔細(xì)考慮其必要性,考慮減少?gòu)?fù)合的字段;
E、如果既有單字段索引,又有這幾個(gè)字段上的復(fù)合索引,一般可以刪除復(fù)合索引;
8、頻繁進(jìn)行數(shù)據(jù)操作的表,不要建立太多的索引;
9、刪除無(wú)用的索引,避免對(duì)執(zhí)行計(jì)劃造成負(fù)面影響;
以上是一些普遍的建立索引時(shí)的判斷依據(jù)。一言以蔽之,索引的建立必須慎重,對(duì)每個(gè)索引的必要性都應(yīng)該經(jīng)過(guò)仔細(xì)分析,要有建立的依據(jù)。因?yàn)樘嗟乃饕c不充分、不正確的索引對(duì)性能都毫無(wú)益處:在表上建立的每個(gè)索引都會(huì)增加存儲(chǔ)開(kāi)銷(xiāo),索引對(duì)于插入、刪除、更新操作也會(huì)增加處理上的開(kāi)銷(xiāo)。另外,過(guò)多的復(fù)合索引,在有單字段索引的情況下,一般都是沒(méi)有存在價(jià)值的;相反,還會(huì)降低數(shù)據(jù)增加刪除時(shí)的性能,特別是對(duì)頻繁更新的表來(lái)說(shuō),負(fù)面影響更大
以上就是mysql的索引設(shè)計(jì)原則以及常見(jiàn)索引的區(qū)別的簡(jiǎn)單介紹的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
學(xué)習(xí)教程快速掌握從入門(mén)到精通的SQL知識(shí)。