爲表創建索引,無疑是對數據庫比較好的優化方式之一。如下是本身對索引的總結。mysql
MYSQL QUERY Optimizer對索引的選擇sql
1.即便一個SQL能夠選擇多個索引,可是大多數狀況下它都會選擇一個索引,而放棄其它的索引。數據庫
使用索引的前提:併發
1.索引的存是在where條件以後的。ide
2.在MYSQL中不一樣的存儲引擎對索引的對待也是有點不同的。優化
經常使用的索引類型以及狀況排序
前綴索引(又叫短索引)索引
對串列進行索引,若是可能應該指定一個前綴長度。例如,若是有一個CHAR(255)的 列,若是在前10 個或20 個字符內,多數值是唯一的,那麼就不要對整個列進行索引。短索引不只能夠提升查詢速度並且能夠節省磁盤空間和I/O操做。資源
示例代碼:get
//建立短索引
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中的列是不會使用索引的。
所以數據庫默認排序能夠符合要求的狀況下不要使用排序操做;(排序功能由索引來完成)儘可能不要包含多個列的排序,若是須要最好給這些列建立複合索引。