MySQL數據庫Query的優化算法
一.MySQL Query Optimizer基本工做原理.sql
二.Query語句優化基本思路和原則數據庫
a) 永遠用小結果集驅動大的結果集,(Join語句)性能優化
b) 儘量在索引中完成排序數據結構
c) 只取本身須要的Columns函數
d) 僅僅使用最有效的過濾條件oop
e) 儘量避免複雜的Join和子查詢性能
f) 合理設計並利用索引優化
三.MySQL中主要的四種索引類型spa
a) B-Tree索引
b) Hash索引
c) Full-text索引
d) R-Tree索引
四.索引的利弊
a) 提升檢索效率,下降IO成本
b) 下降數據的排序成本
c) 更新索引的字段須要額外更新索引
五.判斷是否須要建立索引
a) 較頻繁的做爲查詢條件的字段應該建立索引
b) 惟一性較差的字段不適合單首創建索引,即便頻繁做爲查詢條件()
c) 更新很是頻繁的索引不適合建立索引
d) 不出如今where子句中的字段不應建立索引
六.MySQL使用索引的限制
a) MyISAM存儲引擎索引鍵長度總和不能超過1000字節
b) BLOB和TEXT類型的列只能建立前綴索引
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的實現及優化
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) 大字段垂直拆分(user和userinfo,類型text的字段等大字段)
c) 大表水平拆分-基於類型的分拆優化(普通人發的帖子和管理員發的置頂帖子分開)
d) 統計表-準實時優化(定時統計而不是隨時統計)(總帖數,回帖數,top榜)
2.合適的數據類型
a) 儘可能少使用浮點型,可經過乘以一個固定值轉整數存儲,高效
十.MySQL Server性能優化
a) 日誌設置優化