数据库优化-基准测试(三)

基准测试工具

基准测试工具:mysqlslap

是MySQL官方提供的性能基准测试工具,通过客户端模拟工作负载。

其执行包括三个阶段:

1. 创建表结构和加载数据

2. 运行测试

3. 清理数据

#例子1:--only-print 只输出SQL语句并打印 --auto-generate-sql 代表用系统自己生成的SQL脚本来测试
$ mysqlslap --only-print --auto-generate-sql
DROP SCHEMA IF EXISTS `mysqlslap`;
CREATE SCHEMA `mysqlslap`;
use mysqlslap;
CREATE TABLE `t1` (intcol1 INT(32) ,charcol1 VARCHAR(128));
INSERT INTO t1 VALUES (...);
INSERT INTO t1 VALUES (...);
....
SELECT intcol1,charcol1 FROM t1;
INSERT INTO t1 VALUES (...);
SELECT intcol1,charcol1 FROM t1;
INSERT INTO t1 VALUES (...);
...
DROP SCHEMA IF EXISTS `mysqlslap`;
#例子2:只输出SQL语句,对命令计数并打印
$ mysqlslap --only-print --auto-generate-sql | awk ‘{print $1" "$2}‘ | sort | uniq -c | sort -n -r
105 INSERT INTO
5 SELECT intcol1,charcol1
2 DROP SCHEMA
1 use mysqlslap;
1 CREATE TABLE
1 CREATE SCHEMA

说明:

  • 默认,创建和删除数据库mysqlslap
  • 可通过–create-schema=value指定一个不同的数据库名称
  • 在数据加载阶段每个线程执行100个INSERT语句(使用–auto-generate-sql-write-number)
  • 在测试阶段每个线程执行许多INSERT和SELECT语句(使用–auto-generate-sql-loadtype)
#例子3:计数INSERT/SELECT语句,--number-of-queries 代表总共要运行多少次查询
$ mysqlslap --only-print --auto-generate-sql --number-of-queries=100 | awk ‘{print $1}‘ | egrep ‘(INSERT|SELECT)‘ | sort | uniq -c | sort -n -r
154 INSERT INTO
45 SELECT intcol1,charcol1
#例子4:计数INSERT/SELECT语句,--concurrency 代表并发数量
$ mysqlslap --only-print --auto-generate-sql --concurrency=5
--number-of-queries=100 | awk ‘{print $1}‘ | egrep ‘(INSERT|
SELECT)‘ | sort | uniq -c | sort -n -r
154 INSERT INTO
45 SELECT intcol1,charcol1
#例子5:计数INSERT/SELECT语句,--iterations 代表要运行这些测试多少次
$ mysqlslap --only-print --auto-generate-sql --iteration=5
--number-of-queries=100 | awk ‘{print $1}‘ | egrep ‘(INSERT|
SELECT)‘ | sort | uniq -c | sort -n -r
770 INSERT INTO
225 SELECT intcol1,charcol1
#例子6:计数INSERT/SELECT语句,--auto-generate-sql-write-number 每个线程生成write sql语句数量
$ mysqlslap --only-print --auto-generate-sql --number-of-queries=100 --auto-generate-sql-write-number=10000 | awk
‘{print $1}‘ | egrep ‘(INSERT|SELECT)‘ | sort | uniq -c |
sort -n -r
10054 INSERT
45 SELECT
#例子7:计数INSERT/SELECT语句,--auto-generate-sql-load-type=read 代表要测试的是读还是写还是两者混合的
$ mysqlslap --only-print --auto-generate-sql --number-of-queries=100 –auto-generate-sql-write-number=10000
--auto-generate-sql-load-type=read | awk ‘{print $1}‘ |
egrep ‘(INSERT|SELECT)‘ | sort | uniq -c | sort -n -r
9999 INSERT
100 SELECT
#例子8:并发数1,2,3次执行性能比较,共执行查询100次,生成100000个INSERT语句
$ mysqlslap --auto-generate-sql --concurrency=1,2,3 –-iteration=10 \
--number-of-queries=100 –auto-generate-sql-write-number=100000
Benchmark
Average number of seconds to run all queries: 4.522 seconds
Minimum number of seconds to run all queries: 4.216 seconds
Maximum number of seconds to run all queries: 4.648 seconds
Number of clients running queries: 1
Average number of queries per client: 100
Benchmark
Average number of seconds to run all queries: 3.025 seconds
Minimum number of seconds to run all queries: 2.737 seconds
Maximum number of seconds to run all queries: 3.227 seconds
Number of clients running queries: 2
Average number of queries per client: 50
Benchmark
Average number of seconds to run all queries: 2.618 seconds
Minimum number of seconds to run all queries: 2.338 seconds
Maximum number of seconds to run all queries: 2.746 seconds
Number of clients running queries: 3
Average number of queries per client: 33
#例子9:比较myisam,innodb引擎性能,并发执行数4,共执行100次查询
$ mysqlslap --auto-generate-sql –-concurrency=4 \
--engine=myisam,innodb --number-of-queries=100 \
--iteration=10 --auto-generate-sql-write-number=100000
Benchmark
Running for engine myisam
Average number of seconds to run all queries: 2.232 seconds
Minimum number of seconds to run all queries: 2.003 seconds
Maximum number of seconds to run all queries: 2.319 seconds
Number of clients running queries: 4
Average number of queries per client: 25
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 5.332 seconds
Minimum number of seconds to run all queries: 5.314 seconds
Maximum number of seconds to run all queries: 5.370 seconds
Number of clients running queries: 4
Average number of queries per client: 25
#例子10:比较myisam,innodb引擎性能,并发执行数4,共执行1000次查询
$ mysqlslap --auto-generate-sql --concurrency=4 \
--engine=myisam,innodb --number-of-queries=1000 \
--iteration=10 --auto-generate-sql-write-number=10000
Benchmark
Running for engine myisam
Average number of seconds to run all queries: 2.059 seconds
Minimum number of seconds to run all queries: 1.937 seconds
Maximum number of seconds to run all queries: 2.169 seconds
Number of clients running queries: 4
Average number of queries per client: 250
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 5.604 seconds
Minimum number of seconds to run all queries: 5.560 seconds
Maximum number of seconds to run all queries: 5.659 seconds
Number of clients running queries: 4
Average number of queries per client: 250
#例子11:比较myisam,innodb引擎性能,并发执行数4,共执行1000次查询
#concurrent_insert=0 无论MyISAM存储引擎的表数据文件的中间部分是否存在因为删除数据而留下的空闲空间,都不允许并发INSERT
SET GLOBAL concurrent_insert=0;
$ mysqlslap --auto-generate-sql –-concurrency=4 –engine=myisam,innodb \
--number-of-queries=1000 --iteration=10 --auto-generate-sql-write-number=10000
Benchmark
Running for engine myisam
Average number of seconds to run all queries: 3.256 seconds
Minimum number of seconds to run all queries: 3.210 seconds
Maximum number of seconds to run all queries: 3.317 seconds
Number of clients running queries: 4
Average number of queries per client: 250
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 5.615 seconds
Minimum number of seconds to run all queries: 5.585 seconds
Maximum number of seconds to run all queries: 5.699 seconds
Number of clients running queries: 4
Average number of queries per client: 250
SET GLOBAL concurrent_insert=1;
#例子12:比较memory,myisam,innodb引擎性能,并发执行数4,共执行1000次查询
#--auto-generate-sql-add-autoincrement 代表对生成的表自动添加auto_increment列
mysqlslap --auto-generate-sql -–concurrency=4 \
--engine=memory,myisam,innodb --iteration=10 \
--number-of-queries=1000 –auto-generate-sql-write-number=10000 --auto-generate-sql-add-autoincrement
CREATE TABLE `t1` (id serial,intcol1 INT(32) ,charcol1 VARCHAR(128));
Running for engine memory
Average number of seconds to run all queries: 0.035 seconds
Running for engine myisam
Average number of seconds to run all queries: 0.038 seconds
Running for engine innodb
Average number of seconds to run all queries: 0.032 seconds

InnoDB比MEMORY和MyISAM更快?

#例子13:增加测试的持续时间。比较memory,myisam,innodb引擎性能,并发执行数4,共执行10000次查询
$ mysqlslap --auto-generate-sql --concurrency=4
--engine=memory,myisam,innodb --iteration=10 \
--number-of-queries=10000 --auto-generate-sql-writenumber=
10000 --auto-generate-sql-add-autoincrement
Running for engine memory
Average number of seconds to run all queries: 0.430 seconds
Running for engine myisam
Average number of seconds to run all queries: 0.467 seconds
Running for engine innodb
Average number of seconds to run all queries: 0.327 seconds

结果InnoDB胜!

#例子14:增加更多字段。比较memory,myisam,innodb引擎性能,并发执行数4,共执行10000次查询
#--auto-generate-sql, -a 自动生成测试表和数据
#--concurrency=N, -c N 表示并发量,模拟多少个客户端同时执行select
#-number-int-cols=N, -y N 自动生成的测试表中包含多少个数字类型的列,默认1
#--number-char-cols=N, -x N 自动生成的测试表中包含多少个字符类型的列,默认1
#--iterations=N, -i N 测试执行的迭代次数,代表要在不同并发环境下,各自运行测试多少次
$ mysqlslap mysqlslap -a -c4 -y4 -x4
--engine=memory,myisam,innodb -i10 --number-ofqueries=
10000 --auto-generate-sql-write-number=10000
--auto-generate-sql-add-autoincrement
Running for engine memory
Average number of seconds to run all queries: 0.504 seconds
Running for engine myisam
Average number of seconds to run all queries: 0.526 seconds
Running for engine innodb
Average number of seconds to run all queries: 0.468 seconds

InnoDB仍然获胜,但比上次慢了些。

#例子15:增加并发度。比较memory,myisam,innodb引擎性能,并发执行数8,共执行10000次查询
$ mysqlslap mysqlslap -a -c8 -y4 -x4
--engine=memory,myisam,innodb -i10 --number-ofqueries=
10000 --auto-generate-sql-write-number=10000
--auto-generate-sql-add-autoincrement
Running for engine memory
Average number of seconds to run all queries: 0.526 seconds
Running for engine myisam
Average number of seconds to run all queries: 0.596 seconds
Running for engine innodb
Average number of seconds to run all queries: 0.657 seconds

结果InnoDB最慢。

#例子16:工作负载,读取主键。比较memory,myisam,innodb引擎性能,并发执行数8,共执行10000次查询
#--auto-generate-sql-load-type=type 测试语句的类型。代表要测试的环境是读操作还是写操作还是两者混合的。取值包括:read,key,write,update和mixed(默认)
$ mysqlslap mysqlslap --auto-generate-sql-load-type=key -a
-c8 -y4 -x4 --engine=memory,myisam,innodb -i10 --number-ofqueries=
10000 --auto-generate-sql-write-number=10000 –autogenerate-
sql-add-autoincrement
Running for engine memory
Average number of seconds to run all queries: 0.278 seconds
Running for engine myisam
Average number of seconds to run all queries: 0.328 seconds
Running for engine innodb
Average number of seconds to run all queries: 0.324 seconds
时间: 2024-10-17 12:59:46

数据库优化-基准测试(三)的相关文章

数据库优化-基准测试(五)

基准测试工具:DBT2 DBT2是一个OLTP事务性能测试工具.它模拟一个批发供应商,多个职员访问数据库,更新客户信息和检查库存. DBT2是一个TPC's TPC-C基准测试规范的不错的实现,它是MySQL的最流行的基准测试工具之一,但它的文档很缺乏. DBT2:安装Perl模块 DBT2需要的Perl模块: Statistics::Descriptive Test::Parser Test::Reporter 安装Perl模块的方法: $ sudo cpan Statistics::Desc

数据库优化-基准测试(一)

基准测试的目的 基准测试是为了找出系统的瓶颈,包括: 硬件 磁盘.内存.网络等. 操作系统 文件系统.内存管理.驱动.调度等. RDBMS SQL层.存储引擎层. Schema设计 索引.表结构.数据类型. Query Query写的不好.逻辑错误. 应用程序问题 系统各部分之间的交互 磁盘IO.RAM.RDBMS等. 测量值 如何测量?哪里最花时间?哪个组件最忙? 找出造成瓶颈的原因 系统测试计划的需求 选择正确的硬件和软件 : 理解系统的行为 : 理解系统的性能 : 对系统做正确调优和配置

Mysql 数据库优化(三)——分区和分表【个人经验】

引:MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件. 1.首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件, 2.另外还有.MYD和.MYI文件,分别存放了表的数据(.MYD)和索引数据(.MYI). 每个表都有且仅有这样三个文件做为MyISAM存储类型的表的存储,也就是说不管这个表有多少个索引,都是存放在同一个.MYI文件中. MyISAM支持以下三种类型的索引: 1.B-Tree索引 B-Tree索引,顾名思义,就是所有的索引节点都按照ba

数据库优化-基准测试(四)

基准测试工具:sysbench 简述 sysbench多线程基准测试工具,可以测试: 文件I/O性能 Scheduler性能 内存分配和转换速度 POSIX线程实现性能 数据库服务器性能(OLTP) 工具初始开发用于MySQL的性能测试,现在已经扩展到其它数据库. 获取工具的网址: https://code.launchpad.net/~sysbench-developers/sysbench/0.5 http://sysbench.sourceforge.net/ http://dev.mys

数据库优化-基准测试(二)

如何执行基准测试 测试条件 –如何避免常见的错误?需要在一个真实的环境中运行基准测试. 相似或相同的硬件 包括CPU.内存.网络.IO系统 相同的软件配置 相似的数据集大小 相似的数据分布 相似的访问模式 –避免查询和数据缓存 –重新构建访问的分布 相当的线程数量 –多用户和多服务器 记录所有信息 宁可记录无用的信息也不错过重要的信息 文档化所有的步骤以便于重新执行基准测试 配置:硬件.软件版本和参数.数据大小.数据集 收集硬件统计信息(CPU.磁盘.网络.内存) 收集软件统计信息(GLOBAL

单机数据库优化的一些实践(mysql)

数据库优化有很多可以讲,按照支撑的数据量来分可以分为两个阶段:单机数据库和分库分表,前者一般可以支撑500W或者10G以内的数据,超过这个值则需要考虑分库分表.另外,一般大企业面试往往会从单机数据库问起,一步一步问到分库分表,中间会穿插很多数据库优化的问题.本文试图描述单机数据库优化的一些实践,数据库基于mysql,如有不合理的地方,欢迎指正. 1.表结构优化 在开始做一个应用的时候,数据库的表结构设计往往会影响应用后期的性能,特别是用户量上来了以后的性能.因此,表结构优化是一个很重要的步骤.

[mysql][【优化集合】mysql数据库优化集合

三个层面: 1.系统层面 2.mysql配置参数 3.sql语句优化 =========================================================== 一.系统层面 =========================================================== 二.mysql参数层面 http://www.oicto.com/mysql-explain-show/ 2.1slowlog 配置slowlog 配置文件: log-slow

数据库优化处理

数据库的优化程度影响了一个程序的执行力和用户的体验感,所以数据库的优化显得格外重要. 一.框架 根据业务需求选择合适的开发框架,不近对数据库的优化有帮助,而且对于程序后期的维护也很有帮助,根据项目的需求,看项目需要满足多少人的访问量,并发量到多少.不是说小公司就不需要分布式.大数据这些,考虑长期的问题. 将一些固定不常变化的值,设置为常量:采用缓存机制,减少对于数据库的访问(连接池):服务器的优化(队列): 二.数据库本身 1.表结构的设计 表的设计来源于需求,同时表的建立也会影响需求的实现,一

mysql优化-数据库优化、SQL优化

我有一张表w1000,里面有1000万条数据,这张表结构如下:CREATE TABLE `w1000` ( `id` varchar(36) NOT NULL, `name` varchar(10) DEFAULT NULL, `age` int(3) DEFAULT NULL, `money` double(8,2) DEFAULT NULL, `address` varchar(100) DEFAULT NULL, `create_date` datetime(3) DEFAULT NULL