mysql的数据压缩性能对比详情


Posted in MySQL onNovember 07, 2021

数据魔方需要的数据,一旦写入就很少或者根本不会更新。这种数据非常适合压缩以降低磁盘占用。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了。

到此这篇关于mysql的数据压缩性能对比详情的文章就介绍到这了,更多相关mysql的数据压缩性能对比内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
浅谈MySQL user权限表
Jun 18 MySQL
MYSQL 表的全面总结
Nov 11 MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 MySQL
mysql5.6主从搭建以及不同步问题详解
Dec 04 MySQL
mysql sum(if())和count(if())的用法说明
Jan 18 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
mysql查询结果实现多列拼接查询
Apr 03 MySQL
MySQL创建管理HASH分区
Apr 13 MySQL
pt-archiver 主键自增
Apr 26 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 MySQL
Mysql数据库手动及定时备份步骤
一篇文章看懂MySQL主从复制与读写分离
MySQL基于索引的压力测试的实现
Nov 07 #MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 #MySQL
MySQL悲观锁与乐观锁的实现方案
SpringBoot连接MySQL获取数据写后端接口的操作方法
Mysql排序的特性详情
Nov 01 #MySQL
You might like
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
php设计模式 FlyWeight (享元模式)
2011/06/26 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
php类自动加载器实现方法
2015/07/28 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
二级域名或跨域共享Cookies的实现方法
2008/08/07 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
Javascript动画的实现原理浅析
2015/03/02 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
2016/03/22 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
2017/02/15 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
JavaScript undefined及null区别实例解析
2020/07/21 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
[01:09:16]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第一场 1月25日
2021/03/11 DOTA
Django Highcharts制作图表
2016/08/27 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
HTML5拖拽API经典实例详解
2018/04/20 HTML / CSS
Joules美国官网:出色的英国风格
2017/10/30 全球购物
在线课程:Skillshare
2019/04/02 全球购物
Java程序员综合测试题
2014/04/25 面试题
自我介绍演讲稿
2014/01/15 职场文书
运动会通讯稿400字
2014/01/28 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
《开国大典》教学反思
2014/04/19 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL