Please enable JavaScript.
Coggle requires JavaScript to display documents.
Performance MySQL (檔案系統 (關閉 barrier (mount -o barrier=0, /dev/sdc1 /data…
Performance MySQL
檔案系統
禁止 atime, diratime (mount -o noatime -o nodiratime)
開啟 trim (mount -o discard)
關閉 barrier
mount -o barrier=0
/dev/sdc1 /data ext4 default,noatime,nodiratime,nobarrier 0 0
確保4K對齊,如果使用全盤一個分區,例如 mkfs.ext4 /dev/dfa 也可以使用 xfs 構建檔案系統
作業系統
IO 調度策略
SSD/PCIE SSD 推薦 noop,其他推薦 deadline
echo noop > /sys/block/<block devce>/queue/scheduler
禁用塊設備輪轉模式
echo 0 > /sys/block/<block device>/queue/rotational
記憶體
vm.swappiness=0
記憶體最大性能模式
硬體
CPU
選擇最佳效能模式,避免節能模式導致效能不足
關閉 NUMA,降低 swap 機率。numactl --interleave=all
CPU 親和性
echo 2 > /sys/block/<block device>/queue/rq_affinity
確保每個 io 都被其發起的 cpu 處理
RAID Card
選擇 FORCE WB 讀寫策略,選擇適合的放電策略
高 io (RAID10) / 空間需求大 (RAID5)
MySQL
設定優化
IO 相關參數
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_io_capacity = 3000 (PCIE 卡建議更高)
innodb_flush_method = O_DIRECT
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越高設置可以設置的越大
推薦文章-SSD 下的 MySQL IO 优化
記憶體分配
策略
tcmalloc是google的內存分配管理模塊
ptmalloc是glibc的內存分配管理
jemalloc是BSD的提供的內存分配管理
malloc-lib= /usr/lib64/libjemalloc.so.1
系統資源
open_files_limit = 65535
table_open_cache
back_log:大於max_connections
thread_stack=192
併發控制
使用thread_pool
thread_cache_size
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)組合索引。
盡量選擇區分度高的列作為前綴索引:區分度的公式是count(distinct col)/count(*),表示欄位不重復的比例,比例越大我們掃描的記錄數越少
不在索引列使用函數 如 max(id)> 10 ,id+1>3 等
避免單列索引:盡量使用複合索引,精確確定 where 條件對應的行
推薦文章
MySQL索引原理及慢查詢優化
MySQL索引實踐
由淺入深探究 MySQL索引結構原理、性能分析與優化
SQL 開發優化
資料庫架構
單一實例無法解決空間和性能時考慮拆分
導入暫存系統
水平拆分
垂直拆分
一张思维导图学会如何构建高性能MySQL系统