mysql的数据压缩性能对比详情
目录
- 1. 测试环境
- 1.1 软硬件
- 1.2 表结构
- 2. 测试目的
- 2.1 压缩空间对比
- 2.2 查询性能对比
- 3. 测试工具
- 3.1 mysqlslap
- 3.2 测试query
- 4.测试结论
archive
引擎以及针对MyISAM
引擎的myisampack
方式。今天对这两种方式分别进行了测试,对比了二者在磁盘占用以及查询性能方面各自的优劣。至于为什么做这个,你们应该懂的,我后文还会介绍。且看正文:1. 测试环境
1.1 软硬件
一台 64位
2.6.18-92
内核Linux
开发机,4G内存,4个2800Mhz Dual-Core AMD Opteron
(tm) Processor
2220 CPU。MySQL放在一块7200转SAT硬盘,未做
raid
;MySQL未做任何优化, 关闭了
query cache
,目的在于避免query cache
对测试结果造成干扰。1.2 表结构
2424753条记录,生产环境某一个分片的实际数据;
分别建立了(
partition_by1,idx_rank
) 和 (partition_by1,chg_idx
)的联合索引,其中 partition_by1为32长度的varchar类型 ,用于检索;其余两个字段均为浮点数,多用于排序;autokid
作为子增列,充当PRIMARY KEY
,仅作为数据装载时原子性保证用,无实际意义。2. 测试目的
2.1 压缩空间对比
压缩率越大,占用的磁盘空间越小,直接降低数据的存储成本;
2.2 查询性能对比
压缩后查询性能不应该有显著降低。
Archive
是不支持索引的,因此性能降低是必然的,那么我们也应该心里有个谱,到底降低了多少,能不能接受。3. 测试工具
3.1 mysqlslap
官方的工具当然是不二之选。关于
mysqlslap
的介绍请参考 官方文档 。3.2 测试query
截取生产环境访问
topranks_v3
表的实际SQL共9973条,从中抽取访问量较大的7条,并发50,重复执行10次。命令如下:./mysqlslap --defaults-file=../etc/my.cnf -u**** -p**** -c50 -i10 -q ../t.sql --debug-info
4.测试结论
比较项 | 磁盘空间 | 耗时(秒) | CPU Idle | LOAD | 并发 |
基准表(MyISAM) | 403956004 | 2.308 | 30 | 15 | 50 |
ARCHIVE | 75630745 | >300 | 75 | 4 | 1 |
PACK | 99302109 | 2.596 | 30 | 22 | 50 |
根据上面的表格给出的测试数据,我们简单得出以下结论:
- 针对测试表,
Archive
表占用空间约为之前的18.7%
,myisampack
后空间占用约为之前的24.6%;二者相差不多,单纯从空间利用情况来看,我们似乎需要选择archive
表; - 我们再看查询性能,与基准表进行对比。无论在总耗时还是系统负载方面,50并发下的
pack
表查询性能与基准表相当; 而archive
表在单并发情况下耗时超过了5分钟 (实在等不了了,kill之)!
ARCHIVE
引擎基本上可以不考虑了。为什么这个测试过程中
ARCHIVE
引擎如此地慢呢?我们知道,
mysql
提供archive
这种存储引擎是为了降低磁盘开销,但还有一个前提,那就是被归档的数据不需要或者很少被在线查询,偶尔的查询慢一些也是没关系的。鉴于上述原因,archive
表是不允许建立自增列之外的索引的。有了这个共识,我们拿一条测试SQL来分析一下不用索引前后的查询性能差别为什么这么大。
在我们的测试SQL中有这么一条:
SELECT c1,c2,...,cn FROMmysqlslap.rpt_topranks_v3WHERE ... AND partition_by1 = '50008090'ORDER BY added_quantity3 DESCLIMIT 500
我们前边说过,测试的这个表在
partition_by1
这个字段上建立了索引,那么,我们初步判断在基准表和myisampack
表上,这个查询应该用到了partition_by1
的索引; EXPLAIN 一下:mysql> EXPLAIN-> SELECT ... FROMmysqlslap.rpt_topranks_v3-> WHERE ... AND partition_by1 = '50008090'-> ORDER BY added_quantity3 DESC-> LIMIT 500\G*************************** 1. row ***************************id: 1select_type: SIMPLETABLE: rpt_topranks_v3type: refpossible_keys: idx_toprank_pid,idx_toprank_chgKEY: idx_toprank_pidkey_len: 99ref: constrows: 2477Extra: USING WHERE; USING filesort1 row IN SET (0.00 sec)
【mysql的数据压缩性能对比详情】正如我们所料,这个查询用到了建立在
partition_by1
这个字段上的索引,匹配的目标行数为2477,然后还有一个在added_quantity3
字段上的排序。由于added_quantity3
没有索引,所以用到了filesort
。我们再看一下这条SQL在归档表上的 EXPLAIN 结果:
mysql> EXPLAIN-> SELECT ... FROMmysqlslap.rpt_topranks_v3_archive-> WHERE ... AND partition_by1 = '50008090'-> ORDER BY added_quantity3 DESC-> LIMIT 500\G*************************** 1. row ***************************id: 1select_type: SIMPLETABLE: rpt_topranks_v3_archivetype: ALLpossible_keys: NULLKEY: NULLkey_len: NULLref: NULLrows: 2424753Extra: USING WHERE; USING filesort1 row IN SET (0.00 sec)
EXPLAIN 说:“我没有索引可用,所以只能全表扫描2424753行记录,然后再来个
filesort
。”你要追求性能,那显然是委屈MySQL
了。到此这篇关于mysql的数据压缩性能对比详情的文章就介绍到这了,更多相关mysql的数据压缩性能对比内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- Docker应用:容器间通信与Mariadb数据库主从复制