天天看點

關于sql的優化分析

sql執行慢的原因

1.sql語句寫的爛;

2.索引失效;在where經常作為條件查詢的,可以添加索引

例如:select * from t_user where user_id ='xxx';

可以給user_id添加索引

create index idx_user_id on t_user(user_id);//單值索引

如果多個條件

select * from t_user where user_id ='xxx' and name='xxx';

create index idx_user_id on t_user(user_id,name);//多值索引

3.關聯查詢太多join(設計的缺陷和不得已的需求)

4.伺服器調優及各個參數設定(緩沖、線程池等)

一般手寫sql都為

select distinct a.name from a left join b on a.id=b.id where a.id=1 group by a.depart having a.num=1 order by a.sort limit 10;

機讀的順序為:從from -> on-> join -> where -> group by -> having -> select -> distinct -> order by -> limit;

關于sql的優化分析

索引(index)是幫助MySQL高效擷取資料的資料結構,類比字典,簡單了解為“排好序的快速查找資料結構”,影響排序和查找,影響sql中的where後面的查找和order by後的排序。平常所說的索引,如果沒有特别指明,都是指B+樹索引。

索引優勢:類似大學圖書館建書目索引,提高資料檢索的效率,降低資料庫的IO成本

通過索引列對資料進行排序,降低資料排序的成本,降低了CPU的消耗。

索引劣勢:實際上索引也是一張表,該表儲存了主鍵與索引的字段,并指向實體表的記錄,是以索引列也是要占用空間;對表進行insert、update和delete 将會降低速度。因為更新表時,MySQL不僅要儲存資料,還要儲存一下索引檔案每次更新添加了索引列的字段。

哪些情況需要建立索引

1.主鍵自動建立唯一索引

2.頻繁作為查詢條件的字段應該建立索引

3.查詢中與其他表關聯的字段,外鍵關系建立索引

4.頻繁更新的字段不适合建立索引,因為每次更新不單單是更新了記錄,還會更新索引

5.where條件裡用不到的字段不建立索引

6.單件/組合索引的選擇問題,在高并發條件下傾向于建立組合索引

7.查詢中排序的字段,排序字段若通過索引去通路将大大提高排序速度

8.查詢中統計或分組字段。

哪些情況不需要建立索引

1.表記錄太少

2.經常增删改得表

3.資料重複且分布平均的表字段,是以應該隻為最經常查詢和最經常排序的資料列建立索引

注意,如果某個資料列包含許多重複内容,為它建立索引就沒有太大的實際效果。

如果一個表中有2000條記錄,表索引列有1980個不同的值,那麼這個索引的選擇性就是1980/2000=0.99。一個索引的選擇性越接近一,這個索引的效率就越高。

繼續閱讀