mysql压测
关系型数据库性能衡量指标
- qps:query per second,每秒查询数
 - tps:transaction per second,每秒事务数
 
常用压测工具
- mysqlslap
 - sysbench
 - tpcc-mysql
 - mysql benchmark suite
 - mysql super-smack
 - mybench
 
mysqlslap压测
1、安装:
[root@host2 ~]# rpm -qf /usr/bin/mysqlslap 
mariadb-5.5.65-1.el7.x86_64
mariadb的rpm包中包含该工具
[root@host2 ~]# which mysqlslap 
/usr/local/mysql/bin/mysqlslap
# 通用二进制的mysql 5.7也带有该工具
2、使用语法
[root@host2 ~]# man mysqlslap
[root@host2 ~]# mysqlslap --help
3、常用options
--auto-generate-sql ,-a 
#mysqlslap自动生成测试的sql语句;
--auto-generate-sql-load-type=type
#生成的语句类型,读,写,或2者混合;
--auto-generate-sql-add-auto-increment 
#对生成的包,添加auto-increment列
--number-char-cols=N
# 自动生成的测试表,有N个字符类型的列
--numer-int-cols=N
# 自动生成的测试有,有n个整数列
--number-of-queries=n
# 总查询次数
--query=name ,-q
# name是脚本文件名,里面可以定义slq语句,进行测试
--create-schema
# 指定创建的测试库名
--concurrency=n,-c n
# 并发客户端数量
--engine=name,-e name
# 测试哪个存储引擎
--iterations=n,-i n
#  The number of times to run the tests.执行的测试次数,如50个并发执行4次,求平均
--only-print
# 不实际执行,只生成执行步骤信息;
4、测试示例
[root@host2 ~]# mysqlslap -a -uroot
Benchmark
	Average number of seconds to run all queries: 0.003 seconds
	Minimum number of seconds to run all queries: 0.003 seconds
	Maximum number of seconds to run all queries: 0.003 seconds
	Number of clients running queries: 1
	Average number of queries per client: 0
#自动生成测试sql
[root@host2 ~]# mysqlslap -a -c 100 -uroot
Benchmark
	Average number of seconds to run all queries: 0.284 seconds
	Minimum number of seconds to run all queries: 0.284 seconds
	Maximum number of seconds to run all queries: 0.284 seconds
	Number of clients running queries: 100
	Average number of queries per client: 0
并发100,测试1次
[root@host2 ~]# mysqlslap -a -i 10 -uroot
Benchmark
	Average number of seconds to run all queries: 0.002 seconds
	Minimum number of seconds to run all queries: 0.002 seconds
	Maximum number of seconds to run all queries: 0.003 seconds
	Number of clients running queries: 1
	Average number of queries per client: 0
并发1,测试10次
[root@host2 ~]# mysqlslap -a -c 100 -i 10 -uroot
Benchmark
	Average number of seconds to run all queries: 0.178 seconds
	Minimum number of seconds to run all queries: 0.167 seconds
	Maximum number of seconds to run all queries: 0.211 seconds
	Number of clients running queries: 100
	Average number of queries per client: 0
并发100,测试10次
[root@host2 ~]# mysqlslap -a --auto-generate-sql-add-autoincrement -c 100 -i 10 -uroot
Benchmark
	Average number of seconds to run all queries: 0.096 seconds
	Minimum number of seconds to run all queries: 0.091 seconds
	Maximum number of seconds to run all queries: 0.113 seconds
	Number of clients running queries: 100
	Average number of queries per client: 0
并发100,测试10次,有自动增长字段
[root@host2 ~]# mysqlslap -a --auto-generate-sql-load-type=read -c 100 -i 10 -uroot
Benchmark
	Average number of seconds to run all queries: 0.112 seconds
	Minimum number of seconds to run all queries: 0.110 seconds
	Maximum number of seconds to run all queries: 0.117 seconds
	Number of clients running queries: 100
	Average number of queries per client: 0
并发100,测试10次,读类型sql测试
[root@host2 ~]# mysqlslap -a --auto-generate-sql-write-number=1000 -c 100 -i 10 -uroot
Benchmark
	Average number of seconds to run all queries: 0.401 seconds
	Minimum number of seconds to run all queries: 0.362 seconds
	Maximum number of seconds to run all queries: 0.610 seconds
	Number of clients running queries: 100
	Average number of queries per client: 0
并发100,测试10次,测试写类型sql共1000次
[root@host2 ~]# mysqlslap -a -c 50,100,400 --number-of-queries 2000 --iterations=5 --debug-info -uroot
Benchmark
	Average number of seconds to run all queries: 0.390 seconds
	Minimum number of seconds to run all queries: 0.379 seconds
	Maximum number of seconds to run all queries: 0.399 seconds
	Number of clients running queries: 50
	Average number of queries per client: 40
Benchmark
	Average number of seconds to run all queries: 0.388 seconds
	Minimum number of seconds to run all queries: 0.384 seconds
	Maximum number of seconds to run all queries: 0.397 seconds
	Number of clients running queries: 100
	Average number of queries per client: 20
Benchmark
	Average number of seconds to run all queries: 0.473 seconds
	Minimum number of seconds to run all queries: 0.464 seconds
	Maximum number of seconds to run all queries: 0.493 seconds
	Number of clients running queries: 400
	Average number of queries per client: 5
User time 1.13, System time 2.05
Maximum resident set size 17240, Integral resident set size 0
Non-physical pagefaults 60033, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 77541, Involuntary context switches 1
# 50,100,400个并发情况,分别测试,
每种情况测试5次, 
每种情况的查询总次数是200
所以并发小的,每个客户端发起的查询就多一些
[root@host2 ~]# mysqlslap -a -c 50,100,400 --number-of-queries 2000 --iterations=1 --debug-info -uroot
Benchmark
	Average number of seconds to run all queries: 0.400 seconds
	Minimum number of seconds to run all queries: 0.400 seconds
	Maximum number of seconds to run all queries: 0.400 seconds
	Number of clients running queries: 50
	Average number of queries per client: 40
Benchmark
	Average number of seconds to run all queries: 0.399 seconds
	Minimum number of seconds to run all queries: 0.399 seconds
	Maximum number of seconds to run all queries: 0.399 seconds
	Number of clients running queries: 100
	Average number of queries per client: 20
Benchmark
	Average number of seconds to run all queries: 0.487 seconds
	Minimum number of seconds to run all queries: 0.487 seconds
	Maximum number of seconds to run all queries: 0.487 seconds
	Number of clients running queries: 400
	Average number of queries per client: 5
# iterations表示的是每种并发场景下,测试几次,可以看到只测一次的情况下,平均,最大,最小都相同,因为只有测试了一次,
一般测试次数越多,求平均值,越能体现该并发场景下的真实性能;
mysql最佳实践思路
思路:
尽可能解放数据库,将计算逻辑向前转移到业务服务层,mysql的函数,存储过程可以实现的功能尽可能的转移到业务层,大并发情况下,通过业务层扩容可以较为容易实现水平扩展;数据库专注存储和索引逻辑
58到家数据库使用规范
https://zhuanlan.51cto.com/art/201702/531364.htm
- 必须使用innodb引擎
 - 必须使用utf8编码
 - 不使用存储过程,函数,触发器,将这些计算移动到业务层
 - .........
 
my.cnf生产配置示例
硬件:内存32G
innodb_file_per_table=1
# 每表一个单独表文件
max_connections=8000
# 最大并发连接
back_log=300
# 内核级别监听队列排队队列长度
max_connect_erros=1000
#每个客户端允许的最大错误数,超过后,该客户端会被禁止连接,直到mysql重启,或flush hosts清空记录
open_files_limit=10240
# 所有线程打开的表总数量
max_allowed_packet=32m
# 每个连接传输数据大小
wait_timeout=10
# 指定一个请求的最大连接时间
sort_buffer_size=16m
# order by,group by时用到的缓存大小;
join_buffer_size=16m
#不带索引的全表扫描使用的buffer大小
query_cache_limit=4m
# 单个查询能使用的缓冲大小
query_cache_size=128m
# 查询缓存大小
transaction_isolation=repateable-read
# 事务隔离等级
thread_stack=512k
# 线程堆大小
log-bin
# 二进制日志文件前缀
binlog_format=row|mixed|statement
#binlog记录格式
innodb_buffer_pool_size=24G
#innodb使用的缓冲池保存数据和索引,可设置为物理内存的80%
innodb_file_io_threads = 4
#用来同步IO操作的IO线程的数量 
innodb_thread_concurrency = 16 
#在InnoDb核心内的允许线程数量,建议的设置是CPU数量加上磁盘数量的两倍
innodb_log_buffer_size = 16M 
# 用来缓冲日志数据的缓冲区的大小 
innodb_log_file_size = 512M
在日志组中每个日志文件的大小 
innodb_log_files_in_group = 3 
# 在日志组中的文件总数 
innodb_lock_wait_timeout = 120 
# SQL语句在被回滚前,InnoDB事务等待InnoDB行锁的时间 
long_query_time = 2 
#慢查询时长 
log-queries-not-using-indexes
#将没有使用索引的查询也记录下来