mysql innodb高性能应用

27
1 MySQL Innodb高性能应用 UC优视 李运华 2013/10

Upload: ucarticle

Post on 14-Jun-2015

917 views

Category:

Technology


2 download

DESCRIPTION

UCWEB资深工程师李运华在珠三角技术沙龙2013年第10期上的分享 via http://tech.uc.cn/

TRANSCRIPT

Page 1: MySQL Innodb高性能应用

1

MySQL Innodb高性能应用

UC优视 李运华

2013/10

Page 2: MySQL Innodb高性能应用

内容

2

应用技巧应用技巧

实测结果及分析实测结果及分析

注意事项注意事项

常见性能影响因素常见性能影响因素11

22

33

44

Page 3: MySQL Innodb高性能应用

常见性能影响因素

3

因素配置配置

硬件硬件

热点数据热点数据

数据特性数据特性

表记录数表记录数

操作时机操作时机

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

Page 4: MySQL Innodb高性能应用

内容

4

应用技巧应用技巧

实测结果及分析实测结果及分析

注意事项注意事项

常见性能影响因素常见性能影响因素11

22

33

44

Page 5: MySQL Innodb高性能应用

实测结果和分析——基准测试

5

因素配置配置

硬件硬件

热点数据热点数据

数据特性数据特性

操作时机操作时机

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

表记录数表记录数

Page 6: MySQL Innodb高性能应用

实测结果和分析——配置(1/3)

6

查询操作高性能配置和高安全性配置的性能没有明显差别,原因是查询操作不需要写日志,不涉及磁盘操作

主要配置信息:高性能:sync_binlog=100, innodb_flush_log_at_trx_commit=2高安全:sync_binlog=1, innodb_flush_log_at_trx_commit=1

Page 7: MySQL Innodb高性能应用

实测结果和分析——配置(2/3)

7

高安全性配置和高性能配置的性能相差11倍,但高性能配置只有在Innodb buffer pool能够将表的数据全部放入内存时才能体现明显的性能优势。

“表大小大于Innodb buffer pool”的性能比“表大小小于Innodb buffer pool”明显低了很多,两者相差11倍,由此可见,是否进行大量磁盘操作是性能的关键。

Page 8: MySQL Innodb高性能应用

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

8

配置 原因 建议日志路径配置和数据路径配置

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

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

Innodb日志配置太小

日志文件太小,Innodb存储引擎需要频繁的做Checkpoint,影响了性能

Innodb日志配置为200M,配置3个

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

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

Page 9: MySQL Innodb高性能应用

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

9

1)当表大小小于Innodb buffer pool时,整体性能会随着表记录数的增加而略微降低,但各种操作的性能差别总体不大。2)当表大小大于Innodb buffer pool(10KW)时,性能急剧下降(从12000降到1000),性能接近高安全性配置的性能,因为此时磁盘IO成为了性能的主要影响因素。

因此,表记录数本身对性能影响不大,关键是表的大小是否小于Innodb buffer pool。

Page 10: MySQL Innodb高性能应用

实测结果和分析——数据特性:INT vs CHAR

10

理论上来说,INT比CHAR和VARCHAR的性能要高,因为INT运算更快,长度更短;

但实测证实最终对性能影响较大的还是因为INT长度更短,节省了磁盘空间和磁盘IO,从而性能更高

Page 11: MySQL Innodb高性能应用

实测结果和分析——数据特性:CHAR vs VARCHAR

11

理论上来说,CHAR的性能比VARCHAR要高

实测结果:VARCHAR性能等于或者高于CHAR,理论上CHAR和VARCHAR的性能差异对整体性能影响非常小;且VARCHAR能够节省磁盘空间,减少磁盘IO,在表大于内存时反而性能更优

Page 12: MySQL Innodb高性能应用

实测结果和分析——数据特性:key长度变化

12

Key长度不同对性能最主要的影响体现在Key长度越长,表越大,当表大小超过Innodb buffer pool后,性能会下降很明显。

主键对表大小影响尤其明显,因为Innodb是把主键当做行标识,每个索引里面都会存放主键,主键越长,索引越大

Page 13: MySQL Innodb高性能应用

实测结果和分析——数据特性:value长度变化

13

Value10的表记录数是Value250的表记录数的5倍,但性能反而高出16%左右,

由此可以看出,相比表记录数来说,行长度对性能影响更大,行越长性能越低

Value长度为10(表记录数10KW),Value长度为250(表记录数2KW)

Page 14: MySQL Innodb高性能应用

实测结果和分析——操作时机

14

初始值:MySQL Innodb需要将数据从磁盘载入内存稳定值:数据载入已经完成

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

稳定值主要是内存操作,内存大小成为影响性能关键;

实际值?

Page 15: MySQL Innodb高性能应用

实测结果和分析——热点数据(1/2)

15

测试技巧:为了模拟热点数据主要存储在内存中的情况,使用范围查询将前20%数据作为热点数据加载到内存。

例如:SELECT COUNT(*) FROM BT_KV_SHORT_INT_CHAR_10KW WHERE col1 < 20000000

项目 模型

表记录数 1KW(3G),2KW(6G),5KW(15G),10KW(30G)

Key INT

Value CHAR(250)

热点数据 占总数据20%

Innodb buffer pool 4G

Page 16: MySQL Innodb高性能应用

实测结果和分析——热点数据(2/2)

16

热点数据性能:内存大于热点数据时,热点数据性能比随机访问高很多;内存小于热点数据量时,性能比随机访问高一些

原因:Innodb buffer pool采用LRU淘汰算法管理内存

Page 17: MySQL Innodb高性能应用

实测结果和分析——硬件

17

影响因素 原因 建议

磁盘性能 原因是此机器磁盘性能一般,svctm为5ms左右,而原测试机器由于RAID卡启动了回写功能,svctm为1ms左右

打开RAID卡的回写功能,并为RAID卡配置电池

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

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

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

效果

在另外一台机器上测试,事务执行速度由12000下降到4000多

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

Page 18: MySQL Innodb高性能应用

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

18

INT,CHAR,VARCHAR谁比谁更快?11

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

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

Page 19: MySQL Innodb高性能应用

实测结果和分析——总结分析

19

MySQL Innodb性能三角

分类因素分类因素

1)高性能/高安全性配置2)路径、文件配置

1)INT vs CHAR2)VARCHAR vs CHAR3)表记录数4)key长度、value长度5)热点数据6)操作时机

1)硬盘性能

配置

内存 硬盘

Page 20: MySQL Innodb高性能应用

内容

20

应用技巧应用技巧

实测结果及分析实测结果及分析

注意事项注意事项

常见性能影响因素常见性能影响因素11

22

33

44

Page 21: MySQL Innodb高性能应用

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

21

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

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

配置配置

磁盘磁盘

Page 22: MySQL Innodb高性能应用

应用技巧——内存相关

22

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

内存内存

Page 23: MySQL Innodb高性能应用

应用技巧——如果还不能满足?

23

如果以上方法和手段都使用了,还是无法满足要求,该怎么办?

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

Page 24: MySQL Innodb高性能应用

内容

24

应用技巧应用技巧

实测结果及分析实测结果及分析

注意事项注意事项

常见性能影响因素常见性能影响因素11

22

33

44

Page 25: MySQL Innodb高性能应用

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

25

基准测试数据是稳定和可重现的,但不等于实际应用的数据

由于此次测试是基准测试,为了能够得到稳定的数据,每次都只操作一张表,且同时需要做很多手工操作,而现网运行的时候,由于业务的复杂性和各种操作的不确定性,实际数据很难达到本次基准测试的水平。

因此在设计和评估MySQL相关的方案时,如果是采用高性能配置,则不能将文中数据作为决策依据,实际应用时需要基于业务进行性能测试和验证

Page 26: MySQL Innodb高性能应用

Q&A

26

Q&A

Page 27: MySQL Innodb高性能应用

27

Thank You!uc.cn

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