一張思惟導圖學會如何構建高性能 MySQL 系統

做者介紹html

楊奇龍, 前阿里數據庫團隊資深DBA,主要負責淘寶業務線,經歷屢次雙十一,有海量業務訪問DB架構設計經驗。目前就任於有贊科技,負責數據庫運維工做,熟悉MySQL性能優化,故障診斷,性能壓測。mysql

1、簡介sql

最近在壓測新的存儲,正好把工做過程當中積累的對高性能MySQL相關的知識體系構建起來,作成思惟導圖的方式。總結乃一家之言,有不妥之處,望給位讀者朋友指正。數據庫

2、思惟導圖緩存

構建高性能MySQL系統涵蓋從單機、硬件、OS、文件系統、內存到MySQL 自己的配置,以及schema 設計、索引設計 ,再到數據庫架構上的水平和垂直拓展。性能優化

3、內容展現微信

(1)CPU架構

  • CPU親和性:併發

確保每一個io都被其發起的CPU處理app

echo 2 > /sys/block/<block device>/queue/rq_affinity

  • 選擇最大性能模式,避免節能模式致使性能不足

  • 關閉NUMA,下降swap機率

numactl --interleave=all

(2)RAID卡

  • 選擇FORCE WB讀寫策略

  • 選擇合適的充放電策略

  • 高IO,推薦RAID10

  • 空間需求大則RAID5

操做系統

(1)IO調度策略

SSD/PCIE SSD推薦noop,其它推薦deadline

echo noop > /sys/block/<block device>/queue/scheduler

(2)禁用塊設備輪轉模式

echo 0 > /sys/block/<block device>/queue/rotational

(3)內存

  • vm.swappiness=0

  • 內存最大性能模式

文件系統

確保4K對⻬,若是使用全盤一個分區,例如mkfs.ext4 /dev/dfa也可使用xfs 構建文件系統。

禁止atime、diratime

mount -o noatime -o nodiratime

開啓trim

mount -o discard

關閉barrier

mount -o barrier=0

/dev/sdc1 /data ext4 defaults,noatime,nodiratime,nobarrier 0 0

(1)配置優化

IO相關參數

  • innodb_flush_method = O_DIRECT

  • innodb_read_io_threads = 16

  • innodb_write_io_threads = 16

  • innodb_io_capacity = 3000(PCIE卡建議更高)

  • innodb_flush_neighbors=0

    InnoDB存儲引擎在刷新一個髒頁時,會檢測該頁所在區(extent)的全部頁,若是是髒頁,那麼一塊兒刷新。這樣作的好處是經過AIO能夠將多個IO寫操做合併爲一個IO操做。對於傳統機械硬盤建議使用,而對於固態硬盤能夠關閉

  • innodb_flush_log_at_trx_commit

    redo 的刷盤策略

  • sync_binlog

    binlog 的刷盤策略

  • innodb_log_buffer_size

    建議8-16M,有高TPS(好比大於6k)的能夠提升到32M,系統tps越高設置能夠設置的越大

推薦文章 www.cnblogs.com/conanwang/p/5849437.html

內存分配

  • 策略:

jemalloc是BSD的提供的內存分配管理

tcmalloc是google的內存分配管理模塊

ptmalloc是glibc的內存分配管理

malloc-lib= /usr/lib64/libjemalloc.so.1

  • 系統資源:

malloc-lib= /usr/lib64/libjemalloc.so.1

back_log:大於max_connections

thread_stack=192

  • 併發控制:

使用thread_pool

thread_cache_size

(2)schema優化

索引優化

目標:利用最小的索引成本找到最須要的行記錄。

原則:

  • 最左前綴原則:MySQL會一直向右匹配直到遇到範圍查詢(>、<、between、like)就中止匹配,好比a=1 and b=2 and c>3 and d=4 若是創建(a,b,c,d)順序的索引,d是用不到索引的,若是創建(a,b,d,c)的索引則均可以用到,a,b,d的順序能夠任意調整

  • 避免重複索引:idx_abc多列索引,至關於建立了(a)單列索引,(a,b)組合索引以及(a,b,c)組合索引。不在索引列使用函數 如 max(id)> 10 ,id+1>3 等

  • 儘可能選擇區分度高的列做爲前綴索引:區分度的公式是count(distinct col)/count(*),表示字段不重複的比例,比例越大咱們掃描的記錄數越少

推薦文章:

  • MySQL索引原理及慢查詢優化

    http://tech.meituan.com/mysql-index.html

  • MySQL索引實踐

    http://blog.coderland.net/mysql/2015/08/26/MySQL%E7%B4%A2%E5%BC%95%E5%AE%9E%E8%B7%B5/

  • 由淺入深探究 MySQL索引結構原理、性能分析與優化

    http://blog.jobbole.com/87107/

SQL開發優化

  • 不使用存儲過程、觸發器,自定義函數

  • 不使用全文索引

  • 不使用分區表

  • 針對OTLP業務儘可能避免使用多表join和子查詢

  • 不使用*,SELECT使用具體的列名:在發生列的增/刪時,發生列名修改時,最大限度避免程序邏輯中沒有修改致使的BUG,IN的元素個數300-500

  • 避免使用大事務,使用短小的事務:減小鎖等待和競爭

  • 禁止使用%前綴模糊查詢 where like ‘%xxx’

  • 禁止使用子查詢,遇到使用子查詢的狀況,儘可能使用join代替

  • 遇到分頁查詢,使用延遲關聯解決:分頁若是有大offset,能夠先取Id,而後用主鍵id關聯表會提升效率

  • 禁止併發執行count(*),併發致使CPU飆高

  • 禁止使⽤order by rand()

  • 不使用負向查詢,如 not in/like,使用in反向代替

  • 不要一次更新大量(大於30000條)數據,批量更新/刪除

  • SQL中使用到OR的改寫爲用 IN() (or的效率沒有in的效率高)

數據庫架構

  • 單實例沒法解決空間和性能需求時考慮拆分

  • 垂直拆分

  • 水平拆分

  • 引入緩存系統

4、說明

  1. IO相關的優化可能還不完整,之後會逐步完善。

  2. 關於數據庫系統水平和垂直拆分是一個比較大的命題,這裏略過,每一個公司的業務規模不同,選取的拆分策略也有所不一樣。

5、下載方式

點擊文末【閱讀原文】或登陸雲盤http://pan.baidu.com/s/1dFpI4t7,可下載高清版思惟導圖。

也歡迎你們提供本身的想法,一塊兒來完善這張高性能MySQL系統思惟導圖,可直接在本文微信評論區留言或發送郵件至:editor@dbaplus.cn。

 

相關文章
相關標籤/搜索