索引可以提高資料的訪問速度,但同時也增加了插入、更新和刪除操作的處理時間。所以是否要為表增加索引、索引建立在那些欄位上,是建立索引前必須要考慮的問題。解決此問題就是分析應用程式的業務處理、資料使用,為經常被用作查詢條件、或者被要求排序的字段建立索引。
1、primary key 字段, 系統自動建立主鍵的索引;
unique kye 字段,系統自動建立對應的索引;
foreign key 約束所定義的作為外來鍵的字段應該有索引
作為primary key的域/域組不能為null。而unique key可以.primary key一般在邏輯設計中用作記錄標識,這也是設定
primary key的本來用意, 而unique key只是為了保證域/域組的唯一性。
2、資料量超過300的表應該有索引
3、經常與其他表進行連線的表,在連線欄位上應該建立索引
4、經常出現在where子句中的字段,特別是大表的字段,應該建立索引,可以加快搜尋的速度
5、經常出現在關鍵字order by、group by、distinct後面的字段,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間
mysql查詢只使用乙個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此資料庫預設排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列建立復合索引。
6、對於那些定義為text, image和bit資料型別的列不應該增加索引,對於大的文字字段甚至超長字段,如果在前10個或20個字元內,多數值是惟一的,那麼就不要對整個列進行索引,使用短索引
7、復合索引是指多字段聯合索引,查詢時經常需要這幾個字段組合一起為條件再查詢
a、正確選擇復合索引中的主列字段,一般是選擇性較好的字段;
b、復合索引的幾個字段是否經常同時以and方式出現在where子句中?單字段查詢是否極少甚至沒有?如果是,則可以建立復合索引;否則考慮單字段索引;
c、索引不會包含有null值的列。復合索引中只要有一列含有null值,那麼這一列對於此復合索引就是無效的。;
d、如果復合索引所包含的字段超過3個,那麼仔細考慮其必要性,考慮減少復合的字段;
e、如果既有單字段索引,又有這幾個欄位上的復合索引,一般可以刪除復合索引;
8、頻繁進行資料操作的表,不要建立太多的索引;這是因為,修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因此,當修改效能遠遠大於檢索效能時,不應該建立索引。
9、刪除無用的索引,避免對執行計畫造成負面影響;
10、一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是乙個問題。like 「%aaa%」 不會使用索引而like 「aaa%」可以使用索引。
11. 在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的
1.最左字首匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。
2.=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式
3.盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示欄位不重複的比例,比例越大我們掃瞄的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大資料面前區分度就是0,增加索引,並不能明顯加 快檢索速度。使用場景不同,這個值也很難確定,一般需要join的字段我們都要求是0.1以上,即平均1條掃瞄10條記錄
4.索引列不能參與計算,保持列「乾淨」,比如from_unixtime(create_time) = 』2014-05-29』就不能使用到索引,原因很簡單,b+樹中存的都是資料表中的字段值,但進行檢索時,需要把所有元素都應用函式才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(』2014-05-29』);
5.盡量的擴充套件索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可
6. 限制表上的索引數目。對乙個存在大量更新操作的表,所建索引的數目一般不要超過3個,最多不要超過5個。索引雖說提高了訪問速度,但太多索引會影響資料的更新操作。
7. 避免在取值朝乙個方向增長的字段(例如:日期型別的字段)上,建立索引;對復合索引,避免將這種型別的字段放置在最前面。由於欄位的取值總是朝乙個方向增長,新記錄總是存放在索引的最後乙個葉頁中,從而不斷地引起該葉頁的訪問競爭、新葉頁的分配、中間分支頁的拆分。此外,如果所建索引是聚集索引,表中資料按照索引的排列順序存放,所有的插入操作都集中在最後乙個資料頁上進行,從而引起插入「熱點」。
8. 對復合索引,按照欄位在查詢條件中出現的頻度建立索引。在復合索引中,記錄首先按照第乙個字段排序。對於在第乙個欄位上取值相同的記錄,系統再按照第二個欄位的取值排序,以此類推。因此只有復合索引的第乙個字段出現在查詢條件中,該索引才可能被使用。因此將應用頻度高的字段,放置在復合索引的前面,會使系統最大可能地使用此索引,發揮索引的作用。
9. 刪除不再使用,或者很少被使用的索引。表中的資料被大量更新,或者資料的使用方式被改變後,原有的一些索引可能不再被需要。資料庫管理員應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。
資料庫索引建立原則
索引並不是越多越好,在合適的字段上建立合適的索引。索引的建立會影響寫資料的操作速度,會占用更多的磁碟空間。所以建立索引最好是在where條件內作為查詢條件。當然也要注意一些細節 1 比如復合索引字首原則,當我們建立a b c三個復合索引時,當我們使用ab或者a或者abc時,索引會被用到,但是使用bc...
資料庫建立索引的原則
鐵律一 天下沒有免費的午餐,使用索引是需要付出代價的。索引的優點有目共睹,但是,卻很少有人關心過採用索引所需要付出的成本。若資料庫管理員能夠對索引所需要付出的代價有乙個充分的認識,也就不會那麼隨意到處建立索引了。仔細數數,其實建立索引的代價還是蠻大的。如建立索引和維護索引都需要花費時間與精力。特別是...
資料庫建立索引的原則
鐵律一 天下沒有免費的午餐,使用索引是需要付出代價的。索引的優點有目共睹,但是,卻很少有人關心過採用索引所需要付出的成本。若資料庫管理員能夠對索引所需要付出的代價有乙個充分的認識,也就不會那麼隨意到處建立索引了。仔細數數,其實建立索引的代價還是蠻大的。如建立索引和維護索引都需要花費時間與精力。特別是...