Mysql-Archive存储引擎

Archive 引擎 Archive 存储 引擎 只 支持 INSERT 和 SELECT 操作, 在 MySQL 5. 1 之前 也不 支持 索引。 Archive 引擎 会 缓存 所 有的 写 并 利用 zlib 对 插入 的 行进 行 压缩, 所 以比 MyISAM 表 的 磁盘 I/ O 更少。 但是 每次 SELECT 查询 都 需要 执行 全 表 扫描。 所以 Archive 表 适合 日志 和数 据 采集 类 应用, 这类 应用 做 数据 分析 时 往往 需要 全 表 扫描。 或者 在 一些 需要 更 快速 的 INSERT 操作 的 场合 下 也可以 使用。 Archive 引擎 支持 行 级 锁 和 专用 的 缓冲区, 所以 可以 实现 高 并发 的 插入。 在 一个 查询 开始 直到 返回 表中 存在 的 所有 行数 之前, Archive 引擎 会 阻止 其他的 SELECT 执行, 以 实现 一致性 读。 另外, 也 实现 了 批量 插入 在 完成 之前 对 读 操作 是 不 可见 的。 这种 机制 模仿 了 事务 和 MVCC 的 一些 特性, 但 Archive 引擎 不是 一个 事务 型 的 引擎, 而是 一个 针对 高速 插入 和 压缩 做了 优化 的 简单 引擎。

------引用 高性能Mysql第三版书籍

Archive拥有高性能的插入.下面就建立两个表结构相同,但引擎不同的数据库表,base_archive(Archive存储引擎)和 base_innodb(Innodb存储引擎)

下面的demo是循环给这两个表插入10000条数据,对比下性能

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 using Tops.Plan.DAO;
  7 
  8 namespace 测试Archive和Innodb性能
  9 {
 10     class Program
 11     {
 12      static int length = 10000;
 13         static void Main(string[] args)
 14         {
 15 
 16             base_innodb();
 17             base_archive();
 18             Console.WriteLine("第一次测试");
 19             base_innodb();
 20             base_archive();
 21             Console.WriteLine("第二次测试");
 22             base_innodb();
 23             base_archive();
 24             Console.WriteLine("第三次测试");
 25             base_archive();
 26             base_innodb();
 27             Console.WriteLine("第四次测试");
 28             base_archive();
 29             base_innodb();
 30             Console.WriteLine("第五次测试");
 31             base_archive();
 32             base_innodb();
 33             Console.WriteLine("第六次测试");
 34             Console.ReadKey();
 35         }
 36         public static void base_innodb()
 37         {
 38             CommonInterface pObj_Comm = CommonFactory.CreateInstance(CommonData.MySql, "server=localhost;database=db_line2;user=root;password=123q;port=3306;pooling=true;max pool size=20;persist security info=True;charset=utf8mb4;");
 39 
 40             try
 41             {
 42                 //获取机械23569工序时长
 43                 pObj_Comm.Open();
 44                 DateTime start1 = DateTime.Now;
 45                 for (int i = 0; i < length; i++)
 46                 {
 47                     string strSql = string.Format("INSERT INTO `db_line2`.`base_innodb`" +
 48                                                               " (`Test1`," +
 49                                                               " `Test2`," +
 50                                                               " `Test3`," +
 51                                                               " `Test4`," +
 52                                                               " `Test5`," +
 53                                                               " `Test6`," +
 54                                                               " `Test7`," +
 55                                                               " `Test8`," +
 56                                                               " `Test9`," +
 57                                                                  " `Test10`)" +
 58                                                                            " VALUES" +
 59                                                                            " ({0},'{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}')"
 60                                                                            , i
 61                                                                            , "大的骄傲发哦的风骚激发基地啊1" + i
 62                                                                            , "大的骄傲发哦的风骚激发基地啊2" + i
 63                                                                            , "大的骄傲发哦的风骚激发基地啊3" + i
 64                                                                            , "大的骄傲发哦的风骚激发基地啊4" + i
 65                                                                            , "大的骄傲发哦的风骚激发基地啊5" + i
 66                                                                            , "大的骄傲发哦的风骚激发基地啊6" + i
 67                                                                            , "大的骄傲发哦的风骚激发基地啊7" + i
 68                                                                            , "大的骄傲发哦的风骚激发基地啊8" + i
 69                                                                            , "大的骄傲发哦的风骚激发基地啊9" + i
 70                                                                            );
 71                     pObj_Comm.ExecuteSql(strSql);
 72 
 73                 }
 74                 Console.WriteLine(" base_innodb" + (DateTime.Now - start1).TotalMilliseconds.ToString());
 75                 pObj_Comm.Close();
 76 
 77             }
 78             catch (Exception e)
 79             {
 80                 pObj_Comm.Close();
 81             }
 82         }
 83         public static void base_archive()
 84         {
 85             CommonInterface pObj_Comm = CommonFactory.CreateInstance(CommonData.MySql, "server=localhost;database=db_line2;user=root;password=123q;port=3306;pooling=true;max pool size=20;persist security info=True;charset=utf8mb4;");
 86             try
 87             {
 88                 //获取机械23569工序时长
 89                 pObj_Comm.Open();
 90                 DateTime start1 = DateTime.Now;
 91                 for (int i = 0; i < length; i++)
 92                 {
 93                     string strSql = string.Format("INSERT INTO `db_line2`.`base_archive`" +
 94                                                               " (`Test1`," +
 95                                                               " `Test2`," +
 96                                                               " `Test3`," +
 97                                                               " `Test4`," +
 98                                                               " `Test5`," +
 99                                                               " `Test6`," +
100                                                               " `Test7`," +
101                                                               " `Test8`," +
102                                                               " `Test9`," +
103                                                               " `Test10`)" +
104                                                               " VALUES" +
105                                                               " ({0},'{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}')"
106                                                               , i
107                                                               , "大的骄傲发哦的风骚激发基地啊1" + i
108                                                               , "大的骄傲发哦的风骚激发基地啊2" + i
109                                                               , "大的骄傲发哦的风骚激发基地啊3" + i
110                                                               , "大的骄傲发哦的风骚激发基地啊4" + i
111                                                               , "大的骄傲发哦的风骚激发基地啊5" + i
112                                                               , "大的骄傲发哦的风骚激发基地啊6" + i
113                                                               , "大的骄傲发哦的风骚激发基地啊7" + i
114                                                               , "大的骄傲发哦的风骚激发基地啊8" + i
115                                                               , "大的骄傲发哦的风骚激发基地啊9" + i
116                                                               );
117                     pObj_Comm.ExecuteSql(strSql);
118 
119                 }
120                 Console.WriteLine("base_archive" + (DateTime.Now - start1).TotalMilliseconds.ToString());
121                 pObj_Comm.Close();
122 
123             }
124             catch (Exception e)
125             {
126                 pObj_Comm.Close();
127             }
128         }
129 
130 
131     }
132 }

测试结果:Mysql-Archive存储引擎

 从测试结果可以看出Archive的插入速度在Innodb的7倍以上。

 Mysql-Archive存储引擎

 Innodb的内存是的Archive27倍

使用场景:

一些从设备采集的数据需要大量insert,不需要更新和删除

像这种场景用Archive就比较好。