mysql的数据压缩性能对比详情
作者:IT技术博客 发布时间:2024-01-19 13:02:43
目录
1. 测试环境
1.1 软硬件
1.2 表结构
2. 测试目的
2.1 压缩空间对比
2.2 查询性能对比
3. 测试工具
3.1 mysqlslap
3.2 测试query
4.测试结论
数据魔方需要的数据,一旦写入就很少或者根本不会更新。这种数据非常适合压缩以降低磁盘占用。MySQL本身提供了两种压缩方式――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 FROM mysqlslap.rpt_topranks_v3
WHERE ... AND partition_by1 = '50008090'
ORDER BY added_quantity3 DESC
LIMIT 500
我们前边说过,测试的这个表在partition_by1
这个字段上建立了索引,那么,我们初步判断在基准表和myisampack
表上,这个查询应该用到了partition_by1
的索引; EXPLAIN 一下:
mysql> EXPLAIN
-> SELECT ... FROM mysqlslap.rpt_topranks_v3
-> WHERE ... AND partition_by1 = '50008090'
-> ORDER BY added_quantity3 DESC
-> LIMIT 500\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
TABLE: rpt_topranks_v3
type: ref
possible_keys: idx_toprank_pid,idx_toprank_chg
KEY: idx_toprank_pid
key_len: 99
ref: const
rows: 2477
Extra: USING WHERE; USING filesort
1 row IN SET (0.00 sec)
正如我们所料,这个查询用到了建立在partition_by1
这个字段上的索引,匹配的目标行数为2477,然后还有一个在added_quantity3
字段上的排序。由于added_quantity3
没有索引,所以用到了filesort
。
我们再看一下这条SQL在归档表上的 EXPLAIN 结果:
mysql> EXPLAIN
-> SELECT ... FROM mysqlslap.rpt_topranks_v3_<strong>archive</strong>
-> WHERE ... AND partition_by1 = '50008090'
-> ORDER BY added_quantity3 DESC
-> LIMIT 500\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
TABLE: rpt_topranks_v3_archive
type: ALL
possible_keys: NULL
KEY: NULL
key_len: NULL
ref: NULL
rows: 2424753
Extra: USING WHERE; USING filesort
1 row IN SET (0.00 sec)
EXPLAIN 说:“我没有索引可用,所以只能全表扫描2424753行记录,然后再来个filesort
。”你要追求性能,那显然是委屈MySQL
了。
来源:https://www.tuicool.com/articles/fmMn6nn
猜你喜欢
- 有一个比较有意思的传参方式:比如在 demo1.py 中指定 action='store_true'的时候:parser.a
- 一、对列表(list)进行排序推荐的排序方式是使用内建的sort()方法,速度最快而且属于稳定排序>>> a = [1,9
- 1、如何使用描述符对实例属性做类型检查?实际案例:在某项目中,我们实现了一些类,并希望能像静态类型语言那样(C,C++,Java)对它们的实
- 今天学习Numpy时,想到了一个小问题。在Numpy中,随机生成array是比较容易的,用np.random.rand即可。如下a = np
- 在工作之余抽了点时间写了一下这个,在ie6-ie7-ff下显示位置基本都一致了。(发现demo页面用栅格线做背景,调试还真的容易得多 。热力
- 我用的是Anaconda3 ,用spyder编写pytorch的代码,在Anaconda3中新建了一个pytorch的虚拟环境(虚拟环境的名
- 1. 英雄的简单动画实现需求:在游戏初始化定义一个pygame.Rect的变量记录英雄的初始位置在游戏循环中每次让英雄的y-1--向上移动(
- 见过很多网站,在设计的时候给了用户很大的自由度,我个人并不赞同这种做法。最简单的例子,圈网。我在研究圈网的时候注册完成后圈网给了我一个搜索框
- 引言:Python中的变量在使用中很流畅,可以不关注类型,任意赋值,对于开发来说效率得到了提升,但若不了解其中的机理,往往也会犯一些小错,让
- 这十则CSS技巧汇编于网络,作为老手已经司空见惯了,也没有什么新意,但温故而知新,或许阅读一遍也有一定的启发,本文主要面对CSS新手朋友,有
- 在我上一篇文章,我搭了一个框架,模拟了Flask网站上“@app.route(‘/')”第一条例子的行为。如果你错过了那篇“这不是魔
- 在日常工作中,Python在办公自动化领域应用非常广泛,如批量将多个Excel中的数据进行计算并生成图表,批量将多个Excel按固定格式转换
- Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块。可以通过下图来简单了解条件语句的执行过
- 今天在调试项目的时候出现下面的错误信息:SoapFaultlooks like we got no XML document (D:\php
- 最近写了一些python3程序,四处能看到bytes类型,而它并不存在于python2中,这也是python3和python2显著区别之一。
- 问题最近在研究图学习,在用networkx库绘图的时候发现问题。'''author:zhengtime:2020.1
- WEB程序员的技能要求: Web程序员不光要对 后端程序(如 php,jsp,asp.net)语言知识,对程序设计架构知识,数据库
- 我就废话不多说了,大家还是看代码吧! import PyPDF2 import repdf_file = open('xxx.pdf
- 背景近期看到一篇文章,真的感叹作者的洞察力,在开发时有可能就会犯这样的错误,所以一定要多学习,多实践。其问题就是你在提交事务时,如果中间有其
- Python使用pandas导入xlsx格式的excel文件内容1. 基本导入在 Python中使用pandas导入.xlsx文件的方法是r