1.爲何要調優sql
因爲某些語句執行效率緩慢,致使沒法獲得及時響應服務器
2.簡單調優準備tcp
打開慢查詢日誌函數
show variables like 'slow_query_log'性能
show variables like '%log%'(查看變量設置)優化
set global slow_query_log_file = 'path'日誌
set global log_queries_not_using_indexes =on索引
set global long_query_time = 1(大於1秒的查詢記錄下來)隊列
explain 從句分析查詢性能(具體參數意義可自行查詢)ip
3.調優方式
1)SQL語句優化
針對max函數能夠用索引優化,覆蓋索引
count優化 篩選條件須要增長or null(以避免出現數據不一致狀況)
子查詢優化 優化成join查詢 防止重複數據(1對多。須要增長去重關鍵字distinct)
group by優化 (默認使用臨時表,因此優化方式是不要使用臨時表還有文件表) inner join ( a group by a.id ) as c using(id),即創建相關索引
limit 優化 時常伴隨 order by 因此須要進行文件過濾 :使用主鍵或者索引列進行order by操做 返回上次查詢的id 而後進行id過濾、
2)索引優化
創建合適的索引
where從句 group by從句 order by從句 on從句出現的列適合增長索引
索引的字段越小越好
離散度大的列放到聯合索引前面
索引優化sql的方法(增長索引有利於查詢,不利於寫入,避免重複索引,冗餘索引,索引變動會帶來問題,須要注意)
3)數據表結構優化
選擇合適的數據類型
存下數據的最小類型
使用簡單的數據類型
儘量的使用notnull定義字段
儘可能少用text類型,非用不可的時候考慮分表
範式化和反範式化(第三範式)
反範式化 : 空間換時間
刪除異常 ,更新異常 方式: 表拆分
表結構的垂直拆分
把原來有不少列的表拆分紅多個表
解決了表寬度的問題
把大字段獨立存放到一張表中
把不經常使用字段單獨存放到表中
把經常使用字段存放在一塊兒
表結構的水平拆分
解決表的數據量大
表結構相同
數據均分方法(HASH)
問題:跨表進行數據查詢,統計及後臺報表操做(解決方法:先後臺查詢分開)
4)系統優化
增長tcp支持隊列數
net.ipv4.tcp_max_syn_backlog=65535
減小斷開鏈接時,資源回收
net.ipv4.tcp_max_tw_buckets=8000
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_fin_timeout=10
打開文件數限制
關閉防火牆
(硬件防火牆)
5)服務器硬件優化