MySQL數據庫Query的優化

MySQL數據庫Query的優化算法

一.MySQL Query Optimizer基本工做原理.sql

 

二.Query語句優化基本思路和原則數據庫

  a) 永遠用小結果集驅動大的結果集,(Join語句)性能優化

  b) 儘量在索引中完成排序數據結構

  c) 只取本身須要的Columns函數

  d) 僅僅使用最有效的過濾條件oop

  e) 儘量避免複雜的Join和子查詢性能

  f) 合理設計並利用索引優化

三.MySQL中主要的四種索引類型spa

  a) B-Tree索引

  1. MySQL數據庫使用最頻繁的索引,B-Tree的數據結構存儲
  2. Innodb存儲引擎是B+Tree(分爲主鍵索引和Secondary index)主鍵索引效率較高

  b) Hash索引

  1. Memory存儲引擎使用,經過Hash算法一次定位,效率最高
  2. 弊端:只能進行= in<=>查詢,不能範圍查詢,不能避免表掃描,排序

  c) Full-text索引

  1. MyISAM支持,全文索引,模糊查找時使用like%%

  d) R-Tree索引

  1. 用於範圍查找,B-Tree索引不行

四.索引的利弊

  a) 提升檢索效率,下降IO成本

  b) 下降數據的排序成本

  c) 更新索引的字段須要額外更新索引

五.判斷是否須要建立索引

  a) 較頻繁的做爲查詢條件的字段應該建立索引

  b) 惟一性較差的字段不適合單首創建索引,即便頻繁做爲查詢條件()

  c) 更新很是頻繁的索引不適合建立索引

  d) 不出如今where子句中的字段不應建立索引

六.MySQL使用索引的限制

  a) MyISAM存儲引擎索引鍵長度總和不能超過1000字節

  b) BLOBTEXT類型的列只能建立前綴索引

  c) Mysql目前不支持函數索引

  d) 使用不等於(!=或者<>)的時候MySQL沒法使用索引

  e) 過濾字段使用了函數運算後(abs(column))MySQL沒法使用索引

  f) Join語句中Join條件字段類型不一致的時候MySQL沒法使用索引

  g) 使用LIKE操做的時候若是條件以通配符開始(‘%avd...’)MySQL沒法使用索引

  h) 使用非等值查詢的時候MySQL沒法使用Hash索引

七.Joiny的實現原理及優化思路

  a) 算法是Nested Loop Join即經過驅動表的結果集做爲循環基礎數據進行循環

  b) 儘量減小Join語句的Nested Loop的循環總次數,即用小結果集驅動大結果集

  c) 優先優化Nested Loop的內層循環

  d) 保證Join語句中被驅動表上Join條件字段已經被索引(優化內循環的實現優化方法)

  e) 在沒法保證被驅動表的Join條件字段被索引且內層充足的狀況下,設置Join Buffer

八.ORDRE BY,GROUP BY,DISTINCT的優化

  a) ORDER BY的實現及優化

  1. 一種是經過有序索引直接得到有序數據
  2. 另外一種是經過MySQL的排序算法將數據排序
    1. 共兩種算法,第一種只取排序字段,排序完在去其餘字段
    2. 第二種所有取出,非排序字段放入一塊內存區域
    3. 節省了IO操做,利用內存空間換取時間的優化方式

  iii.儘可能使用第二種排序算法,減小IO操做,提升排序工做效率

  1.加大max_length_for_sort_data參數的設置(字段的最大長度)

  2.去掉沒必要要的返回字段

  3.增大sort_buffer_size參數設置(減小排序中將數據進行分段)

  b) GROUP BY的實現和優化

  i. GROUP BY也須要排序操做,ORDER BY 多了分組操做.實現由三種方式

  1.鬆散索引掃描實現,即徹底利用索引的時候,沒必要掃描全部的索引

  2.緊湊索引掃描,掃描全部索引

  3.使用臨時表實現

  ii.儘量經過索引完成group by操做,

  Iii.不能利用索引的時候,設置sort_buffer_size來供排序的時候創建臨時表

  儘可能不要大結果集的group by超過臨時表的大小將copy到磁盤上,效率急速降低

  c).DISTINCT的實現和優化

  i. group by 的操做類似,只抽取一條記錄

  ii. 在利用臨時表distinct的時候,不排序

九.MySQL數據庫Schema設計的性能優化

  1.高效的模型設計

  a) 適量冗餘,Query減小Join

  b) 大字段垂直拆分(useruserinfo,類型text的字段等大字段)

  c) 大表水平拆分-基於類型的分拆優化(普通人發的帖子和管理員發的置頂帖子分開)

  d) 統計表-準實時優化(定時統計而不是隨時統計)(總帖數,回帖數,top)

  2.合適的數據類型

  a) 儘可能少使用浮點型,可經過乘以一個固定值轉整數存儲,高效

十.MySQL Server性能優化

  a) 日誌設置優化

  1. 系統默認只打開錯誤日誌
相關文章
相關標籤/搜索