Mysql 优化

 1.优化的范围

a. 存储.主机和操作系统:
    主机架构稳定性
    I/O规划及配置
    Swap
    OS 内核参数
    网络问题
    
b. 应用:(Index,lock,session)
     应用程序稳定性和性能
     SQL语句性能
     串行访问资源
     性能欠佳会话管理
     
c. 数据库优化:(内存.数据库设计.参数)
     内存
     数据库结构(物理&逻辑)
     实例配置

2.优化工具介绍

 1.系统屋 :CPU IO MEM

CPU: 计算(主)和调度 (次)
MEM: 缓存和缓冲   (用于磁盘)
IO: 输入

1. top 命令 (用于查看CPU MEM)
a. CPU:
[root@db01 ~15:27:42]# top
%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st  平均占比 最多100%

举列:%Cpu(s): 99.3 us,  0.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
us: 用户程序工作所占用的时间片占比  (用于有效计算--) 这个高表示说明CPU 是在做计算,做正事
    
sy: 内核工作花费的cpu时间片占比    (用于调度--)如果高表示cpu 在做不正常事,调度占比少比较好
过高原因:
内核本身bug  中病毒等
各种资源的调度和分配
并发很高
锁

id: 空闲的CPU时间片占比   值越小,表示CPU越繁忙

wa: CPU 用来等待的时间片占比
IO 如radio 做的不好
等待大的处理事件
锁


PID  USER      PR  NI    VIRT    RES    SHR S   %CPU   %MEM     TIME+ COMMAND    实时观察CPU 内存情况
%CPU 当前某个程序占用总CPU的使用率. 如果是4核CPU,满核为400%,如果是单核100%.

压力测试:
create database test;
use test;
source /root/t100w.sql   #导入数据  

mysqlslap --defaults-file=/etc/my.cnf --concurrency=100 --iterations=1 --create-schema='test' --query="select * from test.t100w where k2='780P'" engine=innodb --number-of-queries=2000 -uroot -p123456abcd -verbose

--concurrency=100 : 模拟同时100会话连接
--create-schema='test' : 操作的库是谁
--query="select * from test.t100w where k2='780P'" :做了什么操作
--number-of-queries=2000 : ⼀共做了多少次查询
Running for engine rbose
Average number of seconds to run all queries: 648.657 seconds
Minimum number of seconds to run all queries: 648.657 seconds
Maximum number of seconds to run all queries: 648.657 seconds
Number of clients running queries: 100
Average number of queries per client: 20

 PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND 
7476 mysql     20   0 1183400 320876  12868 S 99.0 32.2     3:45.84 mysqld     可以看出mysql占用cpu率
*************************************************************************
在top 界面按数字1,可以看到每片cpu 的使用率.因为有时需要查看每片cpu 是用使用的平均
*************************************************************************

b. 内存
[root@db01 ~22:56:49]# top
KiB Mem :   995896 total,   124292 free,   421644 used,   449960 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   396272 avail Mem 

mysql服务器中一般会禁用掉Swap ,如果是文件服务器可以有这个Swap 
 主要看这条:
 396272 avail Mem  表示可用的内存大小,如果不够可以增加内存条 


2. IOstat 命令  (用于查IO)
   iostat -dk 1  如果没有这个命令用 yum install -y sysstat 
[root@db01 ~23:17:18]# iostat -dk 1
Linux 3.10.0-957.el7.x86_64 (db01)     02/08/2021     _x86_64_    (1 CPU)

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.22         2.99         8.35     187538     523781
scd0              0.00         0.02         0.00       1028          0

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.00         0.00         0.00          0          0
scd0              0.00         0.00         0.00          0          0

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.00         0.00         0.00          0          0
scd0              0.00         0.00         0.00          0          0

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.00         0.00         0.00          0          0
scd0              0.00         0.00         0.00          0          0

一般情况下,cpu 高,IO 也应该高.
如果:CPU 高 ,IO 比较低
wait 高: 有可能IO出问题了(raid,过度条带化)
SYS 高: 有可能是锁的问题,需要进一步去数据库中判断和排查
3. glances 命令(查看cpu mem IO)
[root@db01 ~23:30:14]# glances
如果没有可以直接yum install -y glances
db01 (CentOS Linux 7.6.1810 64bit / Linux 3.10.0-957.el7.x86_64)                                 Uptime: 17:36:50

CPU  [  3.8%]   CPU       3.8%  nice:     0.0%        MEM     61.2%        SWAP      0.0%        LOAD    1-core
MEM  [ 61.2%]   user:     2.2%  irq:      0.0%        total:   973M        total:   1024M        1 min:    0.10
SWAP [  0.0%]   system:   1.3%  iowait:   0.0%        used:    595M        used:     264K        5 min:    5.50
                idle:    96.5%  steal:    0.0%        free:    377M        free:    1024M        15 min:  30.85

4. htop 命令(查看CPU MEM )

2 .数据库层

show status
show variables
show index
show processlist
show slave status
show engine innodb status
desc /explain
slowlog

扩展类深度优化:
PT 系列(pt-query-sigest pt-osc pt-index 等)
mysqlslap    压力测试
sysbench
information_schema
performance_schema  (P_S)
sys

3.优化思路(单独主机)

1. 未优化前的压力测试

create database test charset utf8mb4;
use test;
set sql_log_bin=0;
source t100w.sql;
grant 0n *.* to root@'localhost' identified by '123456abcd'

mysqlslap --defaults-file=/etc/my.cnf 
--concurrency=100 --iterations=1 --create-schema='test'
 --query="select * from test.t100w where k2='ABxy'" engine=innodb 
 --number-of-queries=2000 -uroot -p123456abcd -verbose

2.主机.存储.网络

主机:
真实的硬件(PC server):DELL R系统,华为,浪潮,HP,曙光.联想
云产品:
ECS.数据库RDS.DRDS.PolarDB
 
CPU 根据数据库类型
OLTP
OLAP
IO密集型:线上系统,OLTP主要是IO密集型的业务,高并发
CPU密集型:数据分板数据处理,OLAP,CPU密集型的,需要cpu高计算能力(i 系列,IBM Power系列)
cpu密集型: I系列的,主频很高,核心少
IO密集型: E系列的,主频相对低,核心数量多

内存:
建议2-3倍cpu核心数量 ( ECC)

磁盘选择:
SATA-III SAS FC SSD
主机 RAID 卡的BBU 关闭

存储:
raid0:条带化,性能高
raid1:镜像,安全
raid5:校验+条带化,安全较高+性能较高(读),写性能较低(适合于读多写少)
raid10:安全+性能都很高,最少四块磁盘,浪费一增的空间(高IO要求)

网络:
1.硬件买好的(单卡单口)
2.网卡绑定(bonding),交换机堆叠
以上问题,提前规避掉.

3.系统

Swap 调整
临时调整
echo 0 >/proc/sys/vm/swapiness   #将内容改为0,默认为30,当内存达到70%时就会使用Swap分区
永久调整
vim /etc/sysctl.conf
在最后一行增加一行vm.swapiness=0  永久生效
执行sysctl -p

IO调度策略
centos7 默认是deadline
cat /sys/block/sda/queue/scheduler

临时修改为deadline(centos6)
echo deadline >/sys/block/sda/queue/scheduler

vim /boot/grub/grub.conf
更改到如下内容:
kernel /boot/vmlinuz-2.6.18-e15 ro root=LABEL=/ elevator=deadline rhgb quiet

IO:
   raid
   no lvm
   ext4或xfs   最好是xfs
   ssd
   IO调度策略

4.数据库实例(参数) ----参照以上参数微调

[mysqld]
basedir=/data/mysql
datadir=/data/mysql/data
socket=/tmp/mysql.sock
log-error=/var/log/mysql.log
log_bin=/data/binlog/mysql-bin
binlog_format=row
skip-name-resolve
server-id=52
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
relay_log_purge=0
max_connections=1024
back_log=128
wait_timeout=60
interactive_timeout=7200
key_buffer_size=16M
query_cache_size=64M
query_cache_type=1
query_cache_limit=50M
max_connect_errors=20
sort_buffer_size=2M
max_allowed_packet=32M
join_buffer_size=2M
thread_cache_size=200
innodb_buffer_pool_size=1024M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=32M
innodb_log_file_size=128M
innodb_log_files_in_group=3
binlog_cache_size=2M
max_binlog_cache_size=8M
max_binlog_size=512M
expire_logs_days=7
read_buffer_size=2M
read_rnd_buffer_size=2M
bulk_insert_buffer_size=8M
[client]
socket=/tmp/mysql.sock  
        
再次压力测试  :
 mysqlslap --defaults-file=/etc/my.cnf --concurrency=100 --iterations=1 --create-schema='oldboy' --query="select * from oldboy.t_100w where k2='FGCD'" engine=innodb --number-of-queries=200000 -uroot -p123 -verbose

 

 

Do everything well
原文地址:https://www.cnblogs.com/linuxmysql/p/15440543.html