首页 > 数据库 >关于mysql archive存储引擎

关于mysql archive存储引擎

时间:2022-10-12 15:04:22浏览次数:83  
标签:存储 archive MyISAM mysql table iplog Archive


政府还有一个让数据库专家摊上更多事情的职能,就是安全控制和数据审计。那些管理着海量数据仓库的企业官员常常得回答诸如“何人何时修改了什么”或者“何人何时查看了什么”这样的提问。那些拥有数以千计的员工,开展着不计其数的业务的企业,每天都会产生出大量的日志记录数据,而且必须将其好好保存。为了帮助数据库专家应对数据爆炸的挑战,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操作都要少。”

标签:存储,archive,MyISAM,mysql,table,iplog,Archive
From: https://blog.51cto.com/u_15826214/5750761

相关文章

  • mysql给表的字段加索引
    1、添加普通索引ALTERTABLE`table_name`ADDINDEXindex_name(`column`)2、添加主键索引ALTERTABLE`table_name`ADDPRIMARYKEY(`column`)3、添加唯一索引(UNIQ......
  • MySQL5.7 添加用户、删除用户与授权
    mysql-uroot-prootMySQL5.7mysql.user表没有password字段改authentication_string;一.创建用户:命令:CREATEUSER'username'@'host'IDENTIFIEDBY'password';例子:C......
  • MYSQL explain详解
    xplain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。虽然这篇文章我写的很长,但看起来真的不会困啊,真的都是干货啊!!!!......
  • mysql事务处理用法与实例详解
    MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关1.MyISAM:不支持事务,用于只读程序提高性能2.InnoDB:支持ACID事务、行级锁、并发3.BerkeleyDB:支持事务  一......
  • 切换mysql8.0报错
    切换mysql8.0后报错SQLSTATE[HY000][2054]TheserverrequestedauthenticationmethodunknowntotheclientSQLSTATE[HY000][2054]Theserverrequestedauthent......
  • 一文读懂 MySQL 锁
    1MySQL锁简介1.1什么是锁锁是计算机用以协调多个进程间并发访问同一共享资源的一种机制。MySQL中为了保证数据访问的一致性与有效性等功能,实现了锁机制,MySQL中的锁是......
  • MySQL目录结构以及SQL基本概念
    MySQL目录结构1.MySQL安装目录配置文件my.ini2.MySQL数据目录几个概念数据库:文件夹表:文件数据:文件里面存储的数据SQL基本概念什么是SQL:StructuredQUer......
  • Mysql常见使用问题的解决方法
    问题一:Mysql插入中文数据时,报错“incorrectstringvalue”字符转换不正确解决方法:第一种方式:1.更改Mysql安装目录下的文件my.ini(一般在隐藏文件夹ProgramData\Mysql\My......
  • MySQL主从同步原理
    1MySQL主从同步实现方式MySQL主从同步是基于记录原始sql语句的BinLog实现BinLog的三种日志格式包括:Statement记录原始SQL语句,会导致更新时间与原库不一致。比如up......
  • mysql 数据库字段类型大全
    数值tinyint1.十分小的数据,占用1个字节,有符号的范围是-128-127,无符号的范围是从0到255的整型数据2.java类型Integersmallint1.较小的数据,占用2个字节2.java类型I......