当前位置: 首页 > 编程日记 > 正文

关于mysql archive存储引擎-专门存储审计和日志数据

来源:http://60.29.242.49/?p=60

政府还有一个让数据库专家摊上更多事情的职能,就是安全控制和数据审计。 那些管理着海量数据仓库的企业官员常常得回答诸如“何人何时修改了什么”或者“何人何时查看了什么”这样的提问。那些拥有数以千计的员工,开展着不计其数 的业务的企业,每天都会产生出大量的日志记录数据,而且必须将其好好保存。为了帮助数据库专家应对数据爆炸的挑战,MySQL5.0引入了一种新的数据存 储引擎,叫做Archive。这个先进的数据管理工具,让MySQL的专家们拥有了处理和管理海量数据的新式武器。

Archive引擎作用: 为大量很少 引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案,区别于InnoDB、MyISAM提供压缩功能,没有索引。

关于Archive存储引擎的介绍和性能测试的文章:http://dev.mysql.com/tech-resources/articles/storage-engine.html

不喜欢英文的童鞋可以看这篇翻译过来的文章(推荐,翻译的不错):http://guangxin.name/2009/04/mysql50-archive-1.html

根据英文的测试结论来看,Archive表比MyISAM表要小 大约75%,比支持事务处理的InnoDB表小大约83%。当数据量非常大的时候Archive的插入性能表现会较MyISAM为佳。

Archive表的性能是否可能超过MyISAM?答案是肯定 的。根据MySQL工程师的资料,当表内的数据达到1.5GB这个量级,CPU又比较快的时候,Archive表的执行性能就会超越MyISAM表。因为 这个时候,CPU会取代I/O子系统成为性能瓶颈。别忘了Archive表比其他任何类型的表执行的物理I/O操作都要少。

较小的空间占用也能在你移植MySQL数据的时候发挥作用。当你 需要把数据从一台MySQL服务器转移到另一台的时候,Archive表可以方便地移植到新的MySQL环境,你只需将保存Archive表的底层文件复 制过去就可以了。

本着怀疑一切的精神,本人进行了如下的测试:

①建立一个iplog的表:

mysql> create table iplog(id int auto_increment not null primary key,userid int,ip char(15),visit_time datetime) engine=innodb;

②使用python脚本插入50w数据:

#!/usr/bin/mysql

import MySQLdb

conn = MySQLdb.connect(host=”localhost”,user=”root”,passwd=”asdf”,db=”test”,unix_socket=”/data/mysql_3306/mysql.sock”)

cursor = conn.cursor()

for i in range(0,500000):

sql = “insert into iplog(userid,ip,visit_time) values(%s,’127.0.0.1′,now())”%i

cursor.execute(sql)

cursor.close()

conn.commit()

conn.close()

③分别创建iplog对应的archive、 InnoDB、MyISAM对应表格并插入数据

mysql> create table iplog_archive engine=archive as select * from iplog;

Query OK, 500000 rows affected (2.73 sec)

Records: 500000  Duplicates: 0  Warnings: 0

mysql> create table iplog_myisam engine=myisam as select * from iplog;

Query OK, 500000 rows affected (1.39 sec)

Records: 500000  Duplicates: 0  Warnings: 0

mysql> create table iplog_innodb engine=innodb as select * from iplog;

Query OK, 500000 rows affected (4.78 sec)

Records: 500000  Duplicates: 0  Warnings: 0

④比较它们的大小

mysql> select table_name,engine,ROUND(data_length/1024/1024,2) total_size_mb,table_rows from information_schema.tables

-> where table_schema = ‘test’ and table_name like ‘iplog_%’;

+—————+———+—————+————+

| table_name    | engine  | total_size_mb | table_rows |

+—————+———+—————+————+

| iplog_archive | ARCHIVE |          2.10 |     500000 |

| iplog_innodb  | InnoDB  |         30.56 |     500289 |

| iplog_myisam  | MyISAM  |         29.56 |     500000 |

+—————+———+—————+————+

3 rows in set (0.01 sec)

⑤测试select性能:

mysql> select * from iplog_archive where userid=250000;

+——–+——–+———–+———————+

| id     | userid | ip        | visit_time          |

+——–+——–+———–+———————+

| 750001 | 250000 | 127.0.0.1 | 2010-02-01 10:54:20 |

+——–+——–+———–+———————+

1 row in set (0.31 sec)

mysql> select * from iplog_innodb where userid=250000;

+——–+——–+———–+———————+

| id     | userid | ip        | visit_time          |

+——–+——–+———–+———————+

| 750001 | 250000 | 127.0.0.1 | 2010-02-01 10:54:20 |

+——–+——–+———–+———————+

1 row in set (0.48 sec)

mysql> select * from iplog_myisam where userid=250000;

+——–+——–+———–+———————+

| id     | userid | ip        | visit_time          |

+——–+——–+———–+———————+

| 750001 | 250000 | 127.0.0.1 | 2010-02-01 10:54:20 |

+——–+——–+———–+———————+

1 row in set (0.10 sec)

⑥测试insert性能():

使用python脚本再插入50w数据,查看插入性能,脚本如下,没有写 的很复杂,测试InnoDB或者MyISAM要修改代码

#!/usr/bin/mysql

import MySQLdb

conn = MySQLdb.connect(host=”localhost”,user=”root”,passwd=”asdf”,db=”test”,unix_socket=”/data/mysql_3306/mysql.sock”)

cursor = conn.cursor()

for i in range(500001,1000000):

sql = “insert into iplog_archive(userid,ip,visit_time) values(%s,’127.0.0.1′,now())”%i

cursor.execute(sql)

cursor.close()

conn.commit()

conn.close()

archive

real    1m30.467s

user    0m22.270s

sys     0m12.670s

InnoDB

real    0m48.622s

user    0m18.722s

sys     0m9.322s

MyISAM

real    1m32.129s

user    0m13.183s

sys     0m5.624s

测试结果是archive可以大规模的减少空间减少%93(这个 与表有关系),select性能介于MyISAM和InnoDB之间,大规模insert时效率比MyISAM和InnoDB高,至于原因“因为这个时 候,CPU会取代I/O子系统成为性能瓶颈。别忘了Archive表比其他任何类型的表执行的物理I/O操作都要少。”

欢迎大家共同探讨,包括测试用例以及任何想法。

关于time命令的执行结果关于real、user、sys说明

1)实际时间(real time): 从command命令行开始执行到运行终止的消逝时间;

2)用户CPU时间(user CPU time): 命令执行完成花费的用户CPU时间,即命令在用户态中执行时间总和;

3)系统CPU时间(system CPU time): 命令执行完成花费的系统CPU时间,即命令在核心态中执行时间总和。

转载于:https://www.cnblogs.com/itcomputer/articles/4660780.html

相关文章:

使用bitblt提高GDI+绘图的效率(转)

最近在做使用GDI绘制K线界面发现传统的GDI绘制方式效率比较低,根本无法满足K线界面及时刷新的速度要求。 所以做了个GDI绘制图形界面的试验,改试验主要在一个600600的区域内每隔10MS绘制6060个点,每隔10MS改变其颜色,并记录每次绘…

Bruck:一个Web界面布局原型设计框架\n

Bruck是一个面向网页设计师的新型lo-fi原型系统,让设计师可以快速为客户构建响应式且易于访问的布局原型。设计师可以通过组合多达25个Web组件来建立各种布局原型。设计师还可以在Bruck提供的在线Playground中实时可视化组合布局。Bruck可以生成屏幕阅读器可访问和响…

白盒测试方法之语句覆盖测试

语句覆盖测试 概念需求示例测试用例分析设计测试用例脚本语句覆盖情况总结概念 语句覆盖法的基本思想是设计若干测试用例,运行被测程序,使程序中的每个可执行语句至少被执行一次。 需求示例 程序源代码如下: void func(int a, int b, double c

每天学习Linux(3)---pwd命令

Linux中用 pwd 命令来查看”当前工作目录“的完整路径。 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录。 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置。 1.命令格式: pwd […

恢复Opera11.50地址栏的下拉列表按钮

恢复Opera11.50地址栏的下拉列表按钮 我觉得新版本里取消这个功能很蛋痛. -------------------------------------------------- http://www.stormcn.cn/post/1066.html Opera11.50的地址栏从外观上已经默认取消了下拉列表的点击按钮,就是那个在地址栏最右边的倒三角…

大数据推荐(个性化推荐)

大数据推荐分享。三场讲座系统的讲解了关于基于大数据的个性化推荐的体系和针对模型的探索。作为讲师主讲了关于个性化推荐的一些流程和算法。 转载于:https://www.cnblogs.com/wenBlog/articles/10364415.html

白盒测试方法之条件覆盖测试

条件覆盖测试 概念需求示例测试用例分析设计测试用例脚本条件覆盖情况总结概念 条件覆盖的基本思想是设计若干测试用例,执行被测程序以后,要使每个判断中每个条件的可能取值至少满足一次。 这里要强调的是每个判断中的每一个条件,即使是同一条件,但在不同的判断中也需要分…

第三波精品Android源码袭来!免费下载

今天又汇总了一些源码供大家免费下载学习!1.Android实现NewQuickAction快捷菜单NewQuickAction能根据点击事件发生的坐标来显示一个快捷菜单,比如点击位置在靠近底部,则弹出的菜单出现在点击位置的下面,反之,则出现在上…

记一次数据库崩溃的恢复

NEC集群,其中db-2操作系统出现异常,无法点击操作。重启同步主备数据库后,发现数据库出现异常,客户端无法连接,报错:ORA-01033、ORA-00600等。 经分析,是由于操作系统出现异常后强制重启导致数据…

javascript:为string类添加三个成员,实现去左,右,及所有空格

<script language"JavaScript"> //此处为string类添加三个成员 String.prototype.Trim function(){ return Trim(this);} String.prototype.LTrim function(){return LTrim(this);} String.prototype.RTrim function(){return RTrim(this);} //…

MongoDB基本使用

成功启动MongoDB后&#xff0c;再打开一个命令行窗口输入mongo&#xff0c;就可以进行数据库的一些操作。 输入help可以看到基本操作命令&#xff1a; show dbs:显示数据库列表 show collections&#xff1a;显示当前数据库中的集合&#xff08;类似关系数据库中的表&#xff0…

还是这个序列化的解释比较好懂

序列化&#xff08;Serialization&#xff09;是.NET平台最酷的特性之一。 1、为什么要序列化&#xff1a; 首先你应该明白系列化的目的就不难理解他了。系列化的目的就是能在网络上传输对象&#xff0c;否则就无法实现面向对象的分布式计算。比如你的客户端要调用服务器上的一…

InfoQ趋势报告:架构和设计领域技术演变详解

本文概述了我们对当前“架构和设计”领域的看法&#xff0c;这个领域侧重于基础设施模式、技术框架模式的实现&#xff0c;以及软件架构师必须掌握的设计流程和技能。关键要点&#xff1a; 我们看到了“演化式架构”设计需求的增长&#xff0c;这种架构建立在可替换性设计和关注…

白盒测试之基本路径覆盖测试

基本路径覆盖测试 概念独立路径测试用例分析设计自己再试试总结概念 要学习基本路径测试前还需要弄清楚一个概念独立路径。 独立路径是指该路径至少引入一系列新的处理语句或条件的路径。在流程图中从程序入口出发,一条边一条边地往下走,一直走到程序的一个出口,这些边构成…

hdu3321

Problem Description Professor Brute is not good at algorithm design. Once he was asked to solve a path finding problem. He worked on it for several days and finally came up with the following algorithm: Any fool but Brute knows that the function “funny” …

[leedcode 118] Pascal's Triangle

Given numRows, generate the first numRows of Pascals triangle. For example, given numRows 5,Return [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1] ] public class Solution {public List<List<Integer>> generate(int numRows) {//杨辉三角形&#xff0c;把每…

bzoj 4025 二分图——线段树分治+LCT

题目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id4025 线段树分治&#xff0c;用 LCT 维护链的长度即可。不过很慢。 正常&#xff08;更快&#xff09;的方法应该是线段树分治并查集&#xff08;按秩合并&#xff0c;链长可以暴力爬&#xff09;或者 LCT 维…

黑盒测试之功能分解法

功能分解法前言概念需求示例测试用例分析设计总结前言 首先和各位道个歉&#xff0c;最近事情比较多&#xff0c;本来计划的一周一更推迟了这么久。今天咱们继续&#xff0c;开始黑盒测试方法部分的分享。 概念 在学习软件测试的时候经常听到功能分解法&#xff0c;很多人项…

java中Class.forName与new

一、使用Class.forName 1、装载类 Class clazz Class.forName("xx.xx.xx"); 2、初始化对象 clazz.newInstance() 二、使用 new new Object(); 使用Class.forName的好处&#xff0c; 比如加载数据库驱动&#xff0c;若更换数据库&#xff0c;则需要更换驱动。 如果使…

UVA 10041 Vito's Family

UVA_10041这个题目是一个贪心的题目。如果设按升序排列的si的数组为s[]&#xff0c;那么Vito的位置一定为s[(r-1)/2]。对于这一点&#xff0c;我们分两种情况进行讨论&#xff1a;①如果si的数量为奇数&#xff0c;那么Vito的位置一定取数组s[]中间的那个值s[(r-1)/2]。因为如果…

数据结构杂题集

Codechef SD ER • 给出一棵树&#xff0c;维护点集 ?&#xff08;加点删点&#xff09; • 如果 ? 的大小是偶数&#xff0c;输出&#xff1a;如果将 ? 中的点两两连上边权为树上距离的边&#xff0c;那么 ? 里的最小权完美匹配是多少• ?, ? ≤ 10^6 考虑边的贡献 交叉…

黑盒测试方法之等价类划分法

等价类划分法 概念需求示例测试用例分析设计总结概念 等价类是指某个输入域的子集,在该子集中每个输入数据的作用是等效的,也就是该子集中每个输入数据的揭错概率是一样的。等价类分为有效等价类和无效等价类。 等价类划分法是将输入数据分成若干个子集,从每个子集选取一个…

JSEL 表达式

JSTL标签库的使用是为类弥补html表的不足&#xff0c;规范自定义标签的使用而诞生的。在告别modle1模式开发应用程序后&#xff0c;人们开始注重软件的分层设计&#xff0c;不希望在jsp页面中出现java逻辑代码&#xff0c;同时也由于自定义标签的开发难度较大和不利于技术标准化…

JavaEE程序员必读图书大推荐 .

下面是我根据多年的阅读和实践经验&#xff0c;给您推荐的一些图书&#xff1a; 第一部分&#xff1a; Java语言篇 1 《Java编程规范》 星级&#xff1a; 适合对象&#xff1a;初级&#xff0c;中级 介绍&#xff1a;作者James Gosling&#xff08;Java之父&#xff09;&#x…

10 个深恶痛绝的 Java 异常。。

异常是 Java 程序中经常遇到的问题&#xff0c;我想每一个 Java 程序员都讨厌异常&#xff0c;一 个异常就是一个 BUG&#xff0c;就要花很多时间来定位异常问题。 什么是异常及异常的分类请看这篇文章&#xff1a;一张图搞清楚 Java 异常机制。今天&#xff0c;栈长来列一下 J…

黑盒测试方法之边界值分析法

边界值分析法 概念需求示例1测试用例分析设计1需求示例2测试用例分析设计2总结概念 很多错误发生在输入或输出范围的边界上,因此针对各种边界情况设置测试用例,可以更有效地发现缺陷。 边界值分析法测试用例设计方法:1)确定边界情况(输入或输出等价类的边界);2)选取正…

leetcode381. Insert Delete GetRandom O(1) - Duplicates allowed

题目要求 Design a data structure that supports all following operations in average O(1) time.Note: Duplicate elements are allowed. insert(val): Inserts an item val to the collection. remove(val): Removes an item val from the collection if present. getRando…

js 判断 是否为android

引用&#xff1a;http://www.oschina.net/code/snippet_163910_6094 [代码] JavaScript判断方法 view source print?1if(navigator.userAgent.match(/Android/i)) {2 // Do something!3 // Redirect to Android-site?4 window.location http://android.davidwalsh.nam…

B - Networking - poj 1287

有一些地方需要铺盖电缆&#xff0c;这些地方两点间的路可能不止一条&#xff0c;需要求出来至少需要多少电缆才能让所有的点都连接起来&#xff0c;当然&#xff0c;间接连接也算。/#include<iostream>#include<cstring>#include<cstdio>#include<queue&…

因果图方法中的基本符号

因果图方法中的基本符号 前言基本符号1、恒等2、非3、或4、与5、互斥6、包含7、唯一8、要求9、屏蔽总结前言 经过了春节假期,我们重新回到工作学习中。在学习因果图法前首先要学习因果图方法中的基本符号,今天我们就先解决这些基本符合。 基本符号 1、恒等 恒等:表示原因与…