這篇文章給大家介紹MySQL中怎么建立數(shù)據(jù)庫索引,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
創(chuàng)新互聯(lián)成立十余年來,這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、主機(jī)域名、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。網(wǎng)站是否美觀、功能強(qiáng)大、用戶體驗(yàn)好、性價(jià)比高、打開快等等,這些對(duì)于網(wǎng)站建設(shè)都非常重要,創(chuàng)新互聯(lián)通過對(duì)建站技術(shù)性的掌握、對(duì)創(chuàng)意設(shè)計(jì)的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。
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í)間。
索引有哪些缺點(diǎn)?
1、 創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著 數(shù)據(jù)量的增加而增加。
2、 除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占 一定的物理空間,如果要建立聚簇索引,需要的空間就會(huì)更大。
3、 當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候, 索引也要?jiǎng)討B(tài)的維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。
索引有哪些類型?
1、 普通索引
這是最基本的索引類 型,而且它沒有唯一性之類的限制。
2、 唯一性索引
這種索引和前面的“普通索引”基本相同,但有一個(gè)區(qū)別:索引列的所有值都只能出現(xiàn)一次,即必須唯一。
3、主鍵
它是一種特殊 的唯一索引,不允許有空值。
4、全文索引
MySQL從3.23.23版開始支持全 文索引和全文檢索。
單列索引和組合索引:
單列索引就是 把索引單獨(dú)建立在一個(gè)字段上。
組合索引復(fù)合索引就是一個(gè)索引創(chuàng)建在兩個(gè)列或者多個(gè)列上。在搜索時(shí),當(dāng)兩個(gè)或者多個(gè)列作為一個(gè)關(guān)鍵值時(shí),最好在這些列上創(chuàng)建復(fù)合索引。
建立和使用索引有哪些注意事項(xiàng):
1、 索引要建立在經(jīng)常進(jìn)行select操作的字段上。這是因?yàn)椋绻@些列很少用到,那么有無索引并不能明顯改變查詢速度。相反,由于增加了索引,反而降低了系統(tǒng)的維護(hù)速度和增大了空間需求。
2、 索引要建立在值比較唯一的 字段上。這樣做才是發(fā)揮索引的最大效果。,比如主鍵的id字段,唯 一的名字name字段等等。如果索引建立在唯一值比較少的字段,比如性別gender字段,寥寥無幾的類別字段等,剛索引幾乎沒有任何意義。
3、 對(duì)于那些定義為text、image和bit數(shù)據(jù)類型的列不應(yīng)該增加索引。因?yàn)檫@些列的數(shù)據(jù)量要么相當(dāng)大,要么取值很少。
4、 當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí),不應(yīng)該創(chuàng)建索引。修改性能和檢索性能是互相矛盾的。當(dāng)增加索引時(shí),會(huì)提高檢索性能,但是會(huì)降低修改性能。當(dāng)減少索引時(shí),會(huì)提高修改性能,降低檢索性能。因此,當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí),不應(yīng)該創(chuàng)建索引。
5、 在WHERE和JOIN中出現(xiàn)的列需要建立索引。
6、 在以通配符% 和_ 開頭作查詢時(shí),MySQL索引是無效的。但是這樣索引是有效的:select * from tbl1 where name like 'xxx%',所以謹(jǐn)慎的寫你的SQL是很重要的。
用一個(gè)例子詳細(xì)說明單列索引與組合索引的區(qū)別及索引使用中的一些細(xì)節(jié)
建一個(gè)表:
CREATE TABLE myIndex (
i_testID INT NOT NULL AUTO_INCREMENT,
vc_Name VARCHAR(50) NOT NULL,
vc_City VARCHAR(50) NOT NULL,
i_Age INT NOT NULL,
i_SchoolID INT NOT NULL,
PRIMARY KEY (i_testID)
);
在這10000條記錄里面7上8下地分布了5條vc_Name="erquan"的記錄,只不過city,age,school的組合各不相同。
來看這條T-SQL:
SELECT i_testID FROM myIndex WHERE vc_Name='erquan' AND vc_City='鄭 州' AND i_Age=25;
首先考慮建單列索引:
在vc_Name列上建立了索引。執(zhí)行T-SQL時(shí),MYSQL很快將目標(biāo)鎖定在了vc_Name=erquan的5條記錄上,取出來放到一中間 結(jié)果集。在這個(gè)結(jié)果集里,先排除掉vc_City不等于"鄭州"的記錄,再排除i_Age不等于25的記錄,最后篩選出唯一的符合條件的記錄。
雖然在vc_Name上建立了索引,查詢時(shí)MYSQL不用掃描整張表,效率有所提高,但離我們的要求還有一定的距離。同樣的,在vc_City和i_Age分別建立的單列索引的效率相似。
為了進(jìn)一步榨取MySQL的效率,就要考慮建立組合索引。就是將vc_Name,vc_City,i_Age建到一個(gè)索引里:
ALTER TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age);--注意了,建表時(shí),vc_Name長度為50,這里為什么用10呢?因?yàn)橐话闱?況下名字的長 度不會(huì)超過10,這樣會(huì)加速索引查詢速度,還會(huì)減少索引文件的大小,提高INSERT的更新速度。
執(zhí)行T-SQL時(shí),MySQL無須掃描任何記錄就到找到唯一的記錄?。?br/>
肯定有人要問了,如果分別在vc_Name,vc_City,i_Age上建立單列索引,讓該表有3個(gè)單列索引,查詢 時(shí)和上述的組合索引效率一樣 吧?嘿嘿,大不一樣,遠(yuǎn)遠(yuǎn)低于 我們的組合索引~~雖然此時(shí)有了三個(gè)索引,但MySQL只能用到其中的那個(gè)它認(rèn)為似乎是最有效率的單列索引。
建立這樣的組合索引,其實(shí)是相當(dāng)于分別建立了
vc_Name,vc_City,i_Age
vc_Name,vc_City
vc_Name
這樣的三個(gè)組合索引!為什么沒有vc_City,i_Age等這樣的組合索引呢?這是因?yàn)榻M合索引"最左前綴"的結(jié)果。簡單的理解就是只從最左面的開始組合。并不是只要包含這三列的查詢都會(huì)用到該組合索引,下面的幾個(gè)T-SQL會(huì)用到:
SELECT * FROM myIndex WHREE vc_Name="erquan" AND vc_City="鄭州"
SELECT * FROM myIndex WHREE vc_Name="erquan"
而下面幾個(gè)則不會(huì) 用到:
SELECT * FROM myIndex WHREE i_Age=20 AND vc_City="鄭州"
SELECT * FROM myIndex WHREE vc_City="鄭州"
關(guān)于MYSQL中怎么建立數(shù)據(jù)庫索引就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。