狠狠撸

狠狠撸Share a Scribd company logo
MySQL Innodb高性能应用
UC优视 李运华
2013/10

1
内容

1

常见性能影响因素

2

实测结果及分析

3

应用技巧

4

注意事项

2
常见性能影响因素
性能是各种因素的影响综合后的最终体现,高性能的应用需要考虑各个方面

硬件
硬件

配置
配置

热点数据
热点数据

表记录数
表记录数

因素

数据特性
数据特性

操作时机
操作时机

3
内容

1

常见性能影响因素

2

实测结果及分析

3

应用技巧

4

注意事项

4
实测结果和分析——基准测试
基准测试方法:
变化其中一个因素,固定其它因素,对测试结果进行分析

硬件
硬件

配置
配置

热点数据
热点数据

表记录数
表记录数

因素

数据特性
数据特性

操作时机
操作时机

5
实测结果和分析——配置(1/3)
主要配置信息:
高性能:sync_binlog=100, innodb_flush_log_at_trx_commit=2
高安全:sync_binlog=1, innodb_flush_log_at_trx_commit=1

查询操作高性能配置和高安全性配置的性能没有明显差别,原因是查询操作不需要
写日志,不涉及磁盘操作
6
实测结果和分析——配置(2/3)
高安全性配置和高性
能配置的性能相差11
倍,但高性能配置只
有在Innodb buffer
pool能够将表的数据
全部放入内存时才能
体现明显的性能优势。
“表大小大于Innodb
buffer pool”的性能
比“表大小小于
Innodb buffer pool”
明显低了很多,两者
相差11倍,由此可见,
是否进行大量磁盘操
作是性能的关键。

7
实测结果和分析——其它配置(3/3)
配置

效果

原因

建议
日志文件路径和数
据文件路径分开到
不同的磁盘

日志路径配
置和数据路
径配置

当Innodb日志文件
路径和Innodb数据
文件路径配置在同一
磁盘时,性能由
12000下降到5000左
右。

日志和数据都在一块磁
盘,写数据时影响了日
志的写入性能,从而影
响了事务的执行速度

Innodb日志
配置太小

当Innodb日志配置
为5M时,事务执行
速度由12000下降到
2000多,IO很高

Innodb日志配置为
日志文件太小,
200M,配置3个
Innodb存储引擎需要
频繁的做Checkpoint,
影响了性能

8
实测结果和分析——表记录数

1)当表大小小于Innodb buffer pool时,整体性能会随着表记录数的增加而略微降低,但
各种操作的性能差别总体不大。
2)当表大小大于Innodb buffer pool(10KW)时,性能急剧下降(从12000降到1000),
性能接近高安全性配置的性能,因为此时磁盘IO成为了性能的主要影响因素。
因此,表记录数本身对性能影响不大,关键是表的大小是否小于Innodb buffer pool。
9
实测结果和分析——数据特性:INT vs CHAR

理论上来说,INT比CHAR和VARCHAR的性能要高,因为INT运算更快,长度更
短;
但实测证实最终对性能影响较大的还是因为INT长度更短,节省了磁盘空间和磁盘
IO,从而性能更高
10
实测结果和分析——数据特性:CHAR vs VARCHAR

理论上来说,CHAR的性能比VARCHAR要高
实测结果:VARCHAR性能等于或者高于CHAR,理论上CHAR和VARCHAR的性能
差异对整体性能影响非常小;且VARCHAR能够节省磁盘空间,减少磁盘IO,在表大
于内存时反而性能更优
11
实测结果和分析——数据特性:key长度变化

Key长度不同对性能最主要的影响体现在Key长度越长,表越大,当表大小超过
Innodb buffer pool后,性能会下降很明显。
主键对表大小影响尤其明显,因为Innodb是把主键当做行标识,每个索引里面都会存
放主键,主键越长,索引越大
12
实测结果和分析——数据特性:value长度变化
Value长度为10(表记录数10KW),Value长度为250(表记录数2KW)

Value10的表记录数是Value250的表记录数的5倍,但性能反而高出16%左右,
由此可以看出,相比表记录数来说,行长度对性能影响更大,行越长性能越低

13
实测结果和分析——操作时机
初始值:MySQL Innodb需要将数据从磁盘载入内存
稳定值:数据载入已经完成

初始值主要是磁盘操作,表大小和磁盘IO速度成为了影
响性能的关键因素;

实际值?

稳定值主要是内存操作,内存大小成为影响性能关键;
14
实测结果和分析——热点数据(1/2)
项目

模型

表记录数

1KW(3G),2KW(6G),5KW(15G),
10KW(30G)

Key

INT

Value

CHAR(250)

热点数据

占总数据20%

Innodb buffer pool

4G

测试技巧:为了模拟热点数据主要存储在内存中的情况,使用范围查询将前20%数
据作为热点数据加载到内存。
例如:SELECT COUNT(*) FROM BT_KV_SHORT_INT_CHAR_10KW WHERE col1
< 20000000
15
实测结果和分析——热点数据(2/2)

热点数据性能:内存大于热点数据时,热点数据性能比随机访问高很多;内存小于
热点数据量时,性能比随机访问高一些
原因:Innodb buffer pool采用LRU淘汰算法管理内存
16
实测结果和分析——硬件
影响因素

效果

原因

建议

磁盘性能

在另外一台机器上测 原因是此机器磁盘性能 打开RAID卡的回写
试,事务执行速度由 一般,svctm为5ms左 功能,并为RAID卡
12000下降到4000多 右,而原测试机器由于 配置电池
RAID卡启动了回写功能,
svctm为1ms左右

系统内存不
够时性能下
降明显

24G的测试机器内存
只剩下几百M,导致
性能从12000下降到
3000多

系统内存不够,无法
cache Innodb的日志
文件,每次事务写日志
的时候操作系统都需要
从磁盘将对应的日志文
件先读入再写入

至少给操作系统预
留4G内存空间

17
实测结果和分析——看看你记住没有?

1
1

INT,CHAR,VARCHAR谁比谁更快?

2
2

表记录数对性能有很大影响么?

3
3

影响MySQL Innodb性能的关键因素是什么?

18
实测结果和分析——总结分析
MySQL Innodb性能三角
1)高性能/高安全性配置
2)路径、文件配置

配置

分类因素
1)INT vs CHAR
2)VARCHAR vs CHAR
3)表记录数
4)key长度、value长度
5)热点数据
6)操作时机

内存

硬盘

1)硬盘性能

19
内容

1

常见性能影响因素

2

实测结果及分析

3

应用技巧

4

注意事项

20
应用技巧——配置和磁盘相关

配置
1)根据应用需求选择合适的配置,高性能配置比高安全性配置性能高
2)日志路径和数据路径分开磁盘存放

磁盘
1)选择高性能磁盘
2)打开RAID卡的回写功能,为RAID卡配备电池

21
应用技巧——内存相关

内存
1)优先使用较短的类型:INT > VARCHAR >CHAR >其它
2)尽量保持表行长度较小(按照范式设计表)
3)尽量保持索引(特别是主键)较短
3)尽量让内存能够全部将表加载
4)上线前手工执行SLELECT语句预加载数据和索引

22
应用技巧——如果还不能满足?
如果以上方法和手段都使用了,
还是无法满足要求,该怎么办?

终极大杀器:分库分表,构建数据库集群

23
内容

1

常见性能影响因素

2

实测结果及分析

3

应用技巧

4

注意事项

24
注意事项——基准测试数据是最优的

基准测试数据是稳定和可重现的,但不等于实际应用的数据
由于此次测试是基准测试,为了能够得到稳定的数据,每次都只操作一
张表,且同时需要做很多手工操作,而现网运行的时候,由于业务的复
杂性和各种操作的不确定性,实际数据很难达到本次基准测试的水平。
因此在设计和评估MySQL相关的方案时,如果是采用高性能配置,则不
能将文中数据作为决策依据,实际应用时需要基于业务进行性能测试和
验证
25
Q&A

Q&A

26
Thank You!
uc.cn

更多精彩文章,请关注:UC技术博客: http://tech.uc.cn/
新浪微博: @UC技术博客

27

More Related Content

MySQL Innodb高性能应用