更新時(shí)間:2020-04-17 13:57:53 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2893次
眾所周知,在MySQL數(shù)據(jù)庫中,索引是存儲引擎層實(shí)現(xiàn)的,它也是可以迅速找出記錄的一種數(shù)據(jù)結(jié)構(gòu),以犧牲空間的方式來換取時(shí)間。那么MySQL數(shù)據(jù)庫如何建立索引?有哪些技巧呢?本文將從創(chuàng)建索引的原因、原則和技巧三方面進(jìn)行分析,為大家解決上述疑問。
一、為什么要?jiǎng)?chuàng)建索引呢?
1、通過創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。
2、可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因。
3、可以加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。
4、在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí),同樣可以顯著減少查詢中分組和排序的時(shí)間。
5、通過使用索引,可以在查詢的過程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。
二、MySQL數(shù)據(jù)庫創(chuàng)建索引的原則
1、對于查詢頻率高的字段創(chuàng)建索引;
2、對排序、分組、聯(lián)合查詢頻率高的字段創(chuàng)建索引;
3、索引的數(shù)目不宜太多;
4、若在實(shí)際中,需要將多個(gè)列設(shè)置索引時(shí),可以采用多列索引;
5、選擇唯一性索引;
6、盡量使用數(shù)據(jù)量少的索引;
7、盡量使用前綴來索引;
8、刪除不再使用或者很少使用的索引。
三、MySQL數(shù)據(jù)庫建立索引的技巧
1、對查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在where及orderby涉及的列上建立索引。
2、應(yīng)盡量避免在where子句中對字段進(jìn)行null值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:selectidfromtwherenumisnull可以在num上設(shè)置默認(rèn)值0,確保表中num列沒有null值,然后這樣查詢:selectidfromtwherenum=0
3、應(yīng)盡量避免在where子句中使用!=或<>操作符,否則引擎將放棄使用索引而進(jìn)行全表掃描。
4、應(yīng)盡量避免在where子句中使用or來連接條件,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:selectidfromtwherenum=10ornum=20可以這樣查詢:selectidfromtwherenum=10unionallselectidfromtwherenum=20
5、in和notin也要慎用,否則會導(dǎo)致全表掃描,如:selectidfromtwherenumin(1,2,3)對于連續(xù)的數(shù)值,能用between就不要用in了:selectidfromtwherenumbetween1and3
6、避免使用通配符。下面的查詢也將導(dǎo)致全表掃描:selectidfromtwherenamelike‘李%’若要提高效率,可以考慮全文檢索。
7、如果在where子句中使用參數(shù),也會導(dǎo)致全表掃描。因?yàn)镾QL只有在運(yùn)行時(shí)才會解析局部變量,但優(yōu)化程序不能將訪問計(jì)劃的選擇推遲到運(yùn)行時(shí);它必須在編譯時(shí)進(jìn)行選擇。然而,如果在編譯時(shí)建立訪問計(jì)劃,變量的值還是未知的,因而無法作為索引選擇的輸入項(xiàng)。如下面語句將進(jìn)行全表掃描:selectidfromtwherenum=@num可以改為強(qiáng)制查詢使用索引:selectidfromtwith(index(索引名))wherenum=@num
8、在使用索引字段作為條件時(shí),如果該索引是復(fù)合索引,那么必須使用到該索引中的第一個(gè)字段作為條件時(shí)才能保證系統(tǒng)使用該索引,否則該索引將不會被使用,并且應(yīng)盡可能的讓字段順序與索引順序相一致。
9、盡可能的使用varchar/nvarchar代替char/nchar,因?yàn)槭紫茸冮L字段存儲空間小,可以節(jié)省存儲空間,其次對于查詢來說,在一個(gè)相對較小的字段內(nèi)搜索效率顯然要高些。
10、在所有的存儲過程和觸發(fā)器的開始處設(shè)置SETNOCOUNTON,在結(jié)束時(shí)設(shè)置SETNOCOUNTOFF。無需在執(zhí)行存儲過程和觸發(fā)器的每個(gè)語句后向客戶端發(fā)送DONE_IN_PROC消息。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對“Java數(shù)據(jù)庫視頻教程下載, MySQL如何建立索引”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
Java數(shù)據(jù)庫免費(fèi)視頻教程
老杜最新MySQL教程:http://www.dabaquan.cn/javavideo/111.html
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743