![](https://img.kancloud.cn/41/e0/41e066af9a6c25a24868d9667253ec98_1241x333.jpg)
*****
## 什么是基准测试
基准测试是一种测量和评估软件性能指标的活动用于建立某个时刻的性能基准,以便当系统发生软硬件变化时重新进行基准测试以评估变化对性能的影响
<br>基准测试是针对系统设置的一种压力测试
### 基准测试特点
直接、简单、易于比较,用于评估服务器的处理能力
<br>可能不关心业务逻辑,所使用的查询和业务的真实性可以和业务环境没关系
### 压力测试特点
- 对真实的业务数据进行测试,获得真实系统所能承受的压力
- 需要针对不同主题,所使用的数据和查询也是真实用到的
- 基准测试是简化了的压力测试
## 基准测试的目的
* 建立MySQL服务器的性能基准线,确定当前MySQL服务器运行情况,确定优化之后的效果
* 模拟比当前系统更高的负载,已找出系统的扩展瓶颈,可以增加数据库并发,观察QPS(每秒处理的查询数),TPS(每秒处理的事务数)变化,确定并发量与性能最优的关系
* 测试不同的硬件、软件和操作系统配置
* 证明新的硬件设备是否配置正确
## 如何进行基准测试
### 对整个系统进行基准测试
#### 优点
* 能够测试整个系统的性能,包括web服务器缓存、数据库等
* MySQL并不总是出现性能问题的瓶颈,如果只关注MySQL可能忽略其他问题,能反映出系统中各个组件接口间的性能问题体现真实性能状况
#### 缺点
基准测试最重要的就是简单,可能对不同的方案进行测试,找到最优的方案,基准测试进行的时间一定要短,否则就要花费大量的时间进行基准测试
* 测试设计复杂,消耗时间长
### 对MySQL进行基准测试
#### 优点
* 测试设计简单,所耗费时间短
#### 缺点
* 无法全面了解整个系统的性能基线
#### MySQL基准测试的常见指标
* 单位时间内处理的事务数(TPS)
* 单位时间内处理的查询数(QPS)
### MySQL基准测试工具
#### MySQL基准测试之mysqlslap
* 可以模拟服务器负载,并输出相关统计信息
#### 常用参数说明
* \--auto-generate-sql 由系统自动生成SQL脚本进行测试
* \--auto-generate-sql-add-autoincrement 在生成的表中增加自增ID
* \--auto-generate-sql-load-type 指定测试中使用的查询类型 读写或者混合,默认是混合
* \--auto-generate-sql-write-number 指定初始化数据时生成的数据量
* \--concurrency 指定并发线程的数量 1,10,50,200
* \--engine 指定要测试表的存储引擎,可以用逗号分割多个存储引擎
* \--no-drop 指定不清理测试数据
* \--iterations 指定测试运行的次数 指定了这个不能指定no-drop
* \--number-of-queries 指定每一个线程执行的查询数量
* \--debug-info 指定输出额外的内存及CPU统计信息
* \--number-int-cols 指定测试表中包含的INT类型列的数量
* \--number-char-cols 指定测试表中包含的varchar类型的数量
* \--create-schema 指定了用于执行测试的数据库的名字
* \--query 用于指定自定义SQL的脚本
* \--only-print 并不运行测试脚本,而是把生成的脚本打印出来
~~~
mysqlslap --concurrency=1,50,100,200 --iterations=3 --number-int-cols=5 --number-char-cols=5 --auto-generate-sql --auto-generate-sql-add-autoincrement --engine=myisam,innodb --number-of-queries=10 --create-schema=test
~~~
sysbench测试工具:[https://www.cnblogs.com/kismetv/archive/2017/09/30/7615738.html](https://www.cnblogs.com/kismetv/archive/2017/09/30/7615738.html)
<table width="100%" class="table table-striped"><thead><tr><th></th><th>MyISAM</th><th>InnoDB</th></tr></thead><tbody><tr><td>存储结构</td><td>每张表被存放在三个文件: <ol><li>frm-表格定义</li><li>MYD(MYData)-数据文件</li><li>MYI(MYIndex)-索引文件</li></ol></td><td>所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB</td></tr><tr><td>存储空间</td><td>MyISAM可被压缩,存储空间较小</td><td>InnoDB的表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引</td></tr><tr><td>可移植性、备份及恢复</td><td>由于MyISAM的数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作</td><td>免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了</td></tr><tr><td>事务安全</td><td>不支持 每次查询具有原子性</td><td>支持 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表</td></tr><tr><td>AUTO_INCREMENT</td><td>MyISAM表可以和其他字段一起建立联合索引</td><td>InnoDB中必须包含只有该字段的索引</td></tr><tr><td>SELECT</td><td>MyISAM更优</td><td></td></tr><tr><td>INSERT</td><td></td><td>InnoDB更优</td></tr><tr><td>UPDATE</td><td></td><td>InnoDB更优</td></tr><tr><td>DELETE</td><td></td><td>InnoDB更优 它不会重新建立表,而是一行一行的删除</td></tr><tr><td>COUNT without WHERE</td><td>MyISAM更优。因为MyISAM保存了表的具体行数</td><td>InnoDB没有保存表的具体行数,需要逐行扫描统计,就很慢了</td></tr><tr><td>COUNT with WHERE</td><td>一样</td><td>一样,InnoDB也会锁表</td></tr><tr><td>锁</td><td>只支持表锁</td><td>支持表锁、行锁 行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的</td></tr><tr><td>外键</td><td>不支持</td><td>支持</td></tr><tr><td>FULLTEXT全文索引</td><td>支持</td><td>不支持 可以通过使用Sphinx从InnoDB中获得全文索引,会慢一点</td></tr></tbody></table>
- 1-数据库-基本使用
- 1-1-数据存储
- 1-2-数据库
- 1-3-MySQL安装和配置
- 1-4-SQL
- 1-5-数据完整性
- 1-6-命令行操作数据库
- 2-MySQL查询
- 2-1-MySQL查询
- 2-2-条件
- 2-3-聚合函数
- 2-4-分组
- 2-5-排序
- 2-6-分页
- 2-7-连接查询
- 2-8-子查询
- 2-9-自关联
- 3-MySQL外键
- 4-MySQL与Python交互
- 4-1-数据准备
- 4-2-数据表的拆分
- 4-3-Python操作MySQL
- 5-MySQL高级
- 5-1-视图
- 5-2-事务
- 5-3-索引
- 5-4-账户管理(了解)
- 6-数据库存储引擎
- 6-1-MyISAM存储引擎
- 6-2-Innodb存储引擎
- 6-3-CSV存储引擎
- 6-4-Memory存储引
- 7-MySQL基准测试
- 8-explain分析SQL语句
- 8-1-影响服务器性能的几个方面
- 8-2-explain分析SQL
- 9-索引优化案例
- 10-索引优化
- 11-排序优化
- 12-慢查询日志
- 13-Show Profile进行SQL分析
- 14-数据库锁
- 15-主从复制
- 16-MySQL分区表
- 17-MySQL操作规范