mysql下的索引使用原則 為表建立索引,無疑是對數據庫比較好的優化方式之一。以下是自己對索引的總結。 MYSQL QUERY Optimizer對索引的選擇 1.即使一個SQL可以選擇多個索引,但是大多數情況下它都會選擇一個索引,而放棄其它的索引。 使用索引的前提: 1.索引的存是在where條件之後的。 2.在MYSQL中不同的存儲引擎對索引的對待也是有點不一樣的。 常用的索引類型以及情況 前綴索引(又叫短索引) 對串列進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的 列,如果在前10 個或20 個字符內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁盤空間和I/O操作。 示例代碼: //創建短索引 create index ix_test on t(col(200)) //適用的情況 SELECT userName,income FROM t WHERE col like 'john%'; 也就是說: 短索引的適用范圍主要是在like之後第一個非’%’的實例。 組合索引 比如有一條語句是這樣的:select * from users where area=’beijing’ and age=22; 如果我們是在area和age上分別創建單個索引的話,由於mysql查詢每次只能使用一個索引,所以雖然這樣已經相對不做索引時全表掃描提高了很多效率,但是如果在area、age兩列上創建復合索引的話將帶來更高的效率。如果我們創建了(area, age, salary)的復合索引,那麼其實相當於創建了(area,age,salary)、(area,age)、(area)三個索引,這被稱為最佳左前綴特性。 對於組合索引,MYSQL數據庫所進行查詢的原理: select * from users where area=’beijing’ and age=22; select * from users where area=’beijing’; 如果area有索引,則以上的SQL語句都會使用索引,因為組合索引有最佳左前綴的特性,而select * from users where age=22; 則不會使用索引。 因此我們在創建復合索引時應該將最常用作限制條件的列放在最左邊,依次遞減。 單鍵索引還是組合索引 在一般的應用場景中,只要不是其中某個過濾字段在大多數場景下能過濾90%以上的數據(這種可能性很小),而其他的過濾字段會頻繁的更新,一般更傾向於創建組合索引,尤其是在並發量較高的場景下。因為當並發量較高的時候,即使只為每個Query節省了很少的 IO 消耗,但因為執行量非常大,所節省的資源總量仍然是非常可觀的。 當然,創建組合索引並不是說就須要將查詢條件中的所有字段都放在一個索引中,還應該盡量讓一個索引被多個 Query 語句利用,盡量減少同一個表上的索引數量,減少因為數據更新帶來的索引更新成本,同時還可以減少因為索引所消耗的存儲空間。 有OR在SQL語句中來使用索引的情況 如果有or,where後面就必須全面條件有索引,否則索引將不會起作用,所以一定要為or的全部字段創建索引 SELECT * FROM test WHERE last_name='Widenius' OR first_name='Michael'; ordery by以及索引排序 mysql查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。 因此數據庫默認排序可以符合要求的情況下不要使用排序操作;(排序功能由索引來完成)盡量不要包含多個列的排序,如果需要最好給這些列創建復合索引。