1. 程式人生 > >Mysql效能優化實戰

Mysql效能優化實戰

1、索引設計規範
常見索引列建議:
SELECT、UPDATE、DELETE語句的WHERE從句中的列
包含在ORDER BY、GROUP BY、DISTINCT中的欄位,建議聯合索引
多表JOIN的關聯列
索引列的順序:
區分度最高的列放在聯合索引的最左側
儘量把欄位長度小的列放在聯合索引的最左側
使用最頻繁的列放到聯合索引的左側
總結:
每個innodb表都要有一個主鍵
限制表上索引的數量,避免建立重複索引和冗餘索引
注意合理選擇複合索引鍵值的順序
資料庫欄位設計規範
優先選擇符合儲存需要的最小資料型別
將字串轉化為數字型別儲存;使用inet_aton()函式和inet_neoa()函式轉化字串
對於非負資料採用無符號整型進行儲存
varchar(n)中的n代表的是字元數,而不是位元組數
避免使用text、blob資料型別
避免使用enum值修改enum值需要使用alter語句,order by 操作效率低,需要額外操作
儘可能把所有列定義為Not null.所有null列需要額外空間來儲存
同財務相關的金額必須使用decimal型別
資料庫SQL開發規範


建議使用預編譯語句進行資料庫操作
避免資料型別隱式轉換,會導致索引失效
充分利用表上已經存在的索引,避免使用雙%號的查詢條件,一個sql只能利用到複合索引中的一列進行範圍查詢(其它列的索引會失效)、使用left join或not exists來優化not in操作
禁止使用select * 查詢,這將消耗更多的cpu和io以及網路頻寬資源,無法使用覆蓋索引
避免使用子查詢,可以把子查詢優化為Join操作。子查詢返回的結果集無法使用索引,子查詢會產生臨時表,消耗過多的CPU以及IO操作
避免使用JOIN關聯表
使用in代替or ,in的值不要超過500個,更好的利用索引
禁止使用 order by rand()進行隨機排序
禁止在where從句中堆列進行函式轉化和計算,會導致無法使用索引。
在明顯不會有重複值時使用union all而不是union。union會把所有資料放到臨時表中後再進行去重操作。union all 不會再對結果集進行去重操作。
拆分複雜的大sql為小sql,mysql一個sql只能使用一個cpu進行計算