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