1. 程式人生 > >【資料庫】索引優化策略

【資料庫】索引優化策略

                                             索引優化策略

關於什麼是索引,如何建立索引,索引的優缺點等,請移步我的另外一篇文章mysql索引簡談

一、為什麼要建立索引?

一句話,為了加快查詢效率。注意這裡的“查詢”,而不是增刪改。建立索引的列,一旦發生了增加、更新或刪除操作,索引是需要維護的,此外不宜建立大量的索引,索引也佔用磁碟空間。建立索引,應該權衡(查詢)與(磁碟佔用、維護索引)兩者的代價,從而使整個資料庫的效能最優。

二、哪裡可以建立索引?

【1】資料庫以查詢為主,那麼在經常查詢的列上建立索引。

【2】在需要進行join的欄位上建立索引,哪些被join起來的欄位,也應該是相同的型別。

【3】對多個列可以建立聯合索引,不過在查詢的時候,查詢語句需要滿足最左字首原則。

【4】可以在主鍵、外來鍵上建立索引,可以確保主鍵的唯一性。

【5】資料長度比較小的列上,可以建立索引,一來索引檔案比較小,二來記憶體中可以裝載更多的索引鍵。

【6】如果一個列是比較長的字串,為了加快這種長列的查詢速度,可以為其建立字首索引。

三、哪裡應該避免建立索引?

【1】以增刪改為主的資料庫,應該避免建立過多的索引。

【2】區分度比較小的列,或者是查詢基本用不到的列,應該避免建立索引。

【3】表的記錄太少的話,避免建立索引,此時建立索引與不建立索引的效果一致,而此時還要建立索引的話,會佔用額外的空間。

四、哪些sql語句不走索引?

【1】select * from book 當語句中沒有where子句時,那肯定是不走索引的。

【2】select * from book where name(書名,varchar型別) like '%中',不走索引,只要%出現在第一個位置,那麼就不走索引。

【3】select name from book where sell_num(銷量,數值型別) > 100,數值型別進行不等操作時,不走索引。

【4】select name from book where sell_num/2=100,對銷量進行表示式操作或者是函式操作的,不走索引。

可以將sql語句改為 select name from book where sell_num=200

【5】select name from book where author(作者,varchar型別)=‘tom’ or author='jack',使用or進行連線的,也不走索引,應改為select name from book where author='tom' union all select name from book where author='jack'

【6】select name from book where translator(譯者,varchar型別) is null,即進行null值判斷,不走索引,可以在插入書籍資訊的時候,譯者為null的話就存入0,之後使用select name from book where translator='0'來查詢譯者為null的書籍名。

【7】select name from book where version(版本,varchar型別)=1.0,即需要進行隱式型別轉換的,這裡是從varchar型別轉化為浮點型別,不會走索引,將1.0改為‘1.0’,則走索引。

【7】在組合索引中的查詢不滿足最左字首原則時,查詢不走索引。如果我們對book表建立聯合索引(a,b,c),那麼以下的語句是走索引的

select * from book where a='x' ;

select * from book where a='x' and b='y' ;

select * from book where a='x' and c='z ;

select * from book where a='x' and b='y and c='z' ;

而以下語句不走索引

select * from book where b='y' ;

select * from book where c='z' ;

select * from book where b='y' and c='z' ;