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 }
测试结果:
从测试结果可以看出Archive的插入速度在Innodb的7倍以上。
Innodb的内存是的Archive27倍
使用场景:
一些从设备采集的数据需要大量insert,不需要更新和删除
像这种场景用Archive就比较好。