MySQL性能優化

MySQL性能優化可從以下幾個方面着手mysql

  • SQL優化
  • 索引優化
  • 數據庫(表)結構優化
  • 系統配置優化
  • 服務器硬件優化

SQL優化

  • 開啓慢查詢記錄日誌,查找症狀(不少時候都是一些慢查詢拖累了整個數據庫的性能)sql

    • 在配置文件中配置(my.cnf),配置完畢須要重啓,不適合線上數據庫
    #path可修改成絕對或者相對路徑
    log-slow-queries=slow-log-path 
    #l查詢時間超過2s記錄
    long_query_time=2 
    #沒有使用索引的查詢記錄
    log-queries-not-using-indexes
    • mysql命令行下配置
    sql#查看log_query_time變量的值
    show variables like "%long%";
    #若是long_query_time的值不是指望值,從新設定
    set global long_query_time=2;
    #查詢 slow_query_log 和 slow_query_log_file的值
    show variables like "%slow%";
    #開啓慢查詢日誌 on或者ON均可以,不區分大小寫
    set global slow_query_log='on';
    #慢查詢日誌文件路徑可修改
    set global slow_query_log='/data/mysql/slow.log'

    慢查詢日誌分析工具備官方的mysqldumpslow 和pt-query-digest,後者更加精確詳細數據庫

  • explain 分析sql的執行性能優化

    • table 查詢的數據表
    • type (可能的值 const, eq_reg, ref, range, index,all)
      主鍵或者惟一索引通常是const,性能最好
      eq_reg 是一種範圍查找,惟一索引,主鍵多是此種查找
      ref常見於鏈接查詢,一個表基於另一個索引的查找
      range 基於索引的範圍查找
      index一般是對index的掃描
      All 是表掃描
    • possible_keys 查詢中可使用的索引
    • key 查詢中實際使用到的索引,爲null表示沒有使用索引
    • key_len 索引長度,越小越好
    • ref 顯示索引的那一列被使用了,最好是一個常數
    • rows 掃描的行數
    • extra
      出現using filesort 查詢須要優化(group by),出現using temporary須要優化(order by 時容易出現)
  • 掌握一些sql的優化方法
    max, count,子查詢,group by,limit服務器

索引優化

  • 選擇合適的列創建索引(在where中常常出現的查詢條件的列應當建立索引,group by ,order by,on)

    • 索引字段越小越好
    • 離散度大的列放在聯合索引的前面(離散度越大,過濾的數據越多)
      判斷列的離散度能夠根據select count(distinct col1), count(distinct col2) from table
  • 索引優化SQL的方法
    增長索引會影響寫入效率(insert,update,delete)
    刪除重複和冗餘的索引
    使用工具pt-duplicate-key-checker分析
    使用pt-index-usage 工具配合慢查詢日誌來分析再也不使用的索引(注意主從庫的時候沒法使用此工具精確判斷)

數據庫(表)結構優化

  • 選擇合適的(列)數據類型

    • 選擇能夠存下數據的最小的數據類型
    • 選擇儘可能簡單的數據類型
    • 儘量對列加上not null(Innodb特性),給出default
    • 儘快能不使用text等大的數據類型,若是要用,儘可能和其餘字段分離,單獨成表
  • 表的範式和反範式
  • 表的垂直拆分
    把原來有不少列的表拆分紅多個表,下降表的寬度
    拆分原則:不常常使用的字段放在一個表,很大的字段放在一個表,經常使用的字段放在一個表
  • 表的水平拆分
    水平拆分解決單表數據量過大的問題,水平拆分以後的每一張表結構相同
    經常使用拆分方法:取模,hash等
    分錶帶來的挑戰:跨分區表數據查詢;統計及後臺操做。使用匯總表,先後臺業務分開

系統配置的優化

  • 修改/etc/sysctl.conf,優化系統網絡參數
  • 修改/etc/security/limits.conf 優化打開文件數量
  • 硬件防火牆代替軟件防火牆防止網絡性能消耗
  • mysql配置文件

    • innodb_buffer_pool_size
    • innodb_buffer_pool_instances
      mysql 5.5引入,默認一個
    • ... 參數不在一一列舉
  • 第三方工具優化mysql配置
    http://tools.percona.com/wizard

硬件優化

  • cpu選擇
    核數不能超過32,mysql對多核的支持並非特別優秀
  • 磁盤IO(RAID,經常使用RAID1+RAID0)
相關文章
相關標籤/搜索