資料庫優化 ------ 索引的使用問題
最近,在工作的過程中,會時不時的碰到要不要新增索引的問題,於是結合自己的經歷,忙裡偷閒總結下,希望自已以後忘記了可以快速的記憶起來,同時也希望也可以幫助一些跟我一樣有需求的小夥伴。
一直以來,我總是不自覺的去想,到底什麼是索引?為什麼建立索引可以加快查詢的速度?直到後面在網上看到一個答案,那就是其實跟查字典是差不多的概念,建立索引其實就是給字典編頁碼的過程,後面理解起來就簡單的多了。
那就廢話少說,在下面的這些情況下,我覺得應該是要考慮加索引的:
(1)一張表的主鍵
(2)表的物理外來鍵
(3)經常使用者連線的欄位,不管是左連線、還是右連線,還是inner join
(4)表的資料量超過500條記錄的
(5)經常用作查詢條件的,即使where之後的欄位
(6)選擇效能高的欄位(即某種業務需要的)
然後有一些情況,我覺得應該是考慮不加索引的:
(1)表的某個欄位的大小很大,比如Blob型別的
(2)經常進行除了查詢之外的操作的表
實際的情況:
(1)and 前後的欄位經常出現的,可以考慮建立複合索引,但是如果很少的情況,拆分為單個索引
(2)建立複合索引的時候要記住最左匹配原則,3個欄位以上的複合索引要慎重考慮,因為單個索引往往更好
(3)like 查詢的時候,如果使用%like%型別的,其實索引是不起效果的,但是like%這種是可以的,所以like語句也要考慮是否真的必要
(4)對於表字段的值為NULL的情況,一旦有了NUL:L其實索引是不起效果的,複合索引的某個欄位存在NULL值同樣,預設值最好不要使用NULL
(5) mysql查詢一次只使用一個索引,如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的,如果需要可以考慮複合索引
(6) NOT IN 操作適當採用NOT EXIST,因為NOT IN會對全表進行掃描
(7) 不要在相關的欄位中使用資料庫函式,這樣索引也是不起效果的
(8) 短索引的使用,比如一些欄位是varchar型別的,而且前面的部分是相同的,這個可以考慮建立短索引
目前我個人感覺用的比較多的就上面的這些,其實現在隨著mysql的版本的升級,有很多地方資料庫引擎都慢慢幫我們做了適當的優化,需要想更好的使用索引,我覺得還是根據版本看文件的比較好,如果還有其他的情況或者又不對的地方,歡迎指教。