《MySQL索引實戰(zhàn)匯總》要點:
本文介紹了MySQL索引實戰(zhàn)匯總,希望對您有用。如果有疑問,可以聯(lián)系我們。
MySQL索引對數(shù)據(jù)檢索的性能至關(guān)重要,盲目的增加索引不僅不能帶來性能的提升,反而會消耗更多的額外資源,本篇總結(jié)了一些MySQL索引實戰(zhàn)經(jīng)驗.
索引是用于快速查找記錄的一種數(shù)據(jù)結(jié)構(gòu).索引就像是數(shù)據(jù)庫中數(shù)據(jù)的目錄,數(shù)據(jù)庫在查詢時,首先在索引中找到匹配的值,然后根據(jù)這個匹配值找到對應(yīng)的數(shù)據(jù)行.
聚簇索引
聚簇索引的順序便是數(shù)據(jù)的物理存儲順序,索引中數(shù)據(jù)域存儲的便是實際的數(shù)據(jù),一個表最多只能有一個聚簇索引,適用于查詢多行數(shù)據(jù),不適用于頻繁修改的列,一般在主鍵上創(chuàng)建.
非聚簇索引
索引順序與數(shù)據(jù)物理排列順序無關(guān),索引中存儲的內(nèi)容為實際數(shù)據(jù)的地址,適應(yīng)于查詢單行數(shù)據(jù).
普通索引
即平時創(chuàng)建的普通索引.
唯一索引
索引所在的列或列組合的值是全表唯一的.
全文索引
MySQL從3.23.23版開始支持全文索引,它查找的是文中的關(guān)鍵詞,而不是直接比擬索引中的值.
單列索引
在單列上創(chuàng)建的索引.
組合索引
在多個列上創(chuàng)建的索引.
最左前綴
where子句中有a、b、c三個查詢條件,創(chuàng)建一個組合索引abc(a,b,c),最左前綴的概念是說以組合索引最左邊的列a組合成的查詢條件,如(a,b,c)、(a,b)、(a,c),這三種情況的查詢條件都會使用abc索引,和where子句中a、b、c出現(xiàn)的順序沒關(guān)系,可以是where c=? and b=? and a=?,但(b,c)組合不會使用索引,即where c=? and b=?.
1.經(jīng)常作為查詢條件的列;
2.經(jīng)常作為排序條件的列;
3.經(jīng)常作為join條件的列;
4.經(jīng)常被查詢的列.
1.數(shù)據(jù)頻繁被修改的列,數(shù)據(jù)被修改,索引必要做相應(yīng)的修改,消耗資源;
2.區(qū)分度不是很高的列,如性別,列值重復(fù)性太大,索引效果不是很明顯;
3.不是經(jīng)常被作為查詢條件、排序條件、連接條件的列.
1.列上進行函數(shù)計算將不會使用索引;
2.對于創(chuàng)建索引的列,避免存儲NULL,NULL會使索引更加復(fù)雜、效率變低,可以使用NOT NULL進行約束;
3.對于模糊查詢like '%abc%',將不會使用索引,而like 'abc%'將會使用索引;
4.對于not in、not exists、!=等負向查詢將不會使用索引;
5.每次查詢只使用一個索引,如果where條件使用了索引,order by將不再使用索引;
6.對于where子句中有多個查詢條件的,單列索引的效率不如復(fù)合索引,因為查詢每次只能使用一個索引;
7.MySQL只對以下操作符才使用索引:<、<=、=、>、>=、between、in,但是必要注意in的范圍值不要太多;
8.union all可以使用索引,但自己效率不是很高,不建議使用;
9.列上進行類型轉(zhuǎn)換的將不會使用索引;
10.老版本MySQL對OR條件不使用索引,新版本才支持,不建議使用OR.
關(guān)于索引的實戰(zhàn)經(jīng)驗總結(jié)后續(xù)還會賡續(xù)更新.
歡迎參與《MySQL索引實戰(zhàn)匯總》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/7894.html