MySQL性能優化

MySQL性能優化
最近看了一篇MySQL優化的ppt,把相關知識點總結一下。

讓數據庫多做它擅長的事情:
儘量不在數據庫做運算
複雜運算移到程序端CPU
儘可能簡單應用MySQL
舉例:md5(xx字段)、ORDER BY RAND()

合理分表不超載
User id
Date
Area
...
一年內的單表數據:純int不超過1000W,含char不超過500W,單庫不超過300-400個表

表字段少而精
IO高效、全表遍歷、表修復快
提高併發、alter table快
單表不超過50個純int字段
道標不超過20個char(10)字段
單表字段數上限控制在20-50個

效率優先、提升性能
適當時犧牲範式、加入冗餘

拒絕3B
大SQL-BIG SQL
大事務-BIG Transaction
大批量-BIG Batch

數字型VS字符串型索引
更高效
查詢更快
佔用空間更小
舉例:用無符號INT存儲IP,而非char(15)

優先使用ENUM或SET
ENUM佔用1字節,轉爲數值運算
舉例:'sex' enum('F','M') COMMENT '性別'

避免使用NULL字段
很難進行查詢優化
NULL列加索引,需要額外空間
含NULL符合索引無效

少用並拆分TEXT/BLOB
text類型處理性能原低於varchar
   強制生成硬盤臨時表
   浪費更多空間
若必須使用則拆分到單獨的表

謹慎合理添加索引
改善查詢、減慢更新,索引不是越多越好
能不加的索引儘量不加,,最好不超過字段數的20%
重複率高的字段不要加索引
舉例:不要給“性別”列創建索引

不在索引列進行數學運算或函數運算
無法使用索引
導致權標掃描

自增列或全局ID做INNODB主鍵
忌用字符串做主鍵
推薦用獨立與業務的AUTO_INCREMENT列或全局ID生成器做主鍵代理

儘量不用外鍵,由程序保證約束

拒絕大SQL,拆解成多條簡單SQL

一條SQL只能在一個CPU運算
可能一條大SQL就能把數據庫堵死
簡單SQL緩存命中率更高
用上多CPU
減少鎖表時間,特別是MyISAM

儘可能少用存儲過程
儘可能少用觸發器
減少使用MySQL函數對結果進行處理,由客戶端程序負責

儘量不用SELECT *,只取需要的數據列
爲使用覆蓋索引提高可能性

同一字段,將OR改寫爲IN()
OR效率:O(n)
IN效率:O(Log n)
當n很大時,OR會慢很多
注意控制IN的個數,建議n小於200。

將OR改寫爲UNION
減少對不同字段進行"OR"查詢
合併索引往往很“弱智”
如果有足夠信心:set global optimizer_switch='index_merge=off';
舉例:SELECT * FROM user WHERE phone='010-88886666' OR mobile='13800138000';
改寫爲:
SELECT * FROM user WHERE phone='010-88886666'
UNION
SELECT * FROM user WHERE mobile='13800138000';

避免負向查詢:NOT、!=、<>、NOT EXISTS、NOT IN、NOT LIKE等
避免%前綴模糊查詢:使用不了索引、導致全表掃描

舉例:SELECT * FROM POST WHERE city LIKE '北京%';         YES
          SELECT * FROM POST WHERE city LIKE '%北京%';      NO!!!

儘量少用COUNT(*),COUNT(*)的資源開銷快,用COUNT(主鍵)。

用UNION ALL 而非 UNION

若無需對結果進行去重,則用UNION ALL,UNION有去重開銷

高併發DB不建議進行兩個表以上的JOIN

GROUP BY 去除排序

GROUP的功能:分組與自動排序
無需排序:ORDER BY NULL
特定排序:GROUP BY xxx DESC/ASC

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章