【问题标题】:MyISAM vs InnoDB for LoggingMyISAM 与 InnoDB 的日志记录
【发布时间】:2015-03-11 14:42:16
【问题描述】:

我正在优化一个数据库,而我的学士论文几乎没有任何知识。我绝对不想让你为我做这项工作,但我有一些问题到目前为止没人能回答。

表结构:

data_inc, CREATE TABLE 'data_inc' ( 'id' bigint(20) NOT NULL AUTO_INCREMENT, 'id_para' int(10) unsigned NOT NULL DEFAULT '0', 't_s' int(11) unsigned NOT NULL DEFAULT '0', 't_ms' smallint(6) unsigned NOT NULL DEFAULT '0', 't_ns' bigint(20) unsigned NOT NULL DEFAULT '0', 'id_inst' smallint(6) NOT NULL DEFAULT '1', 'value' varchar(255) NOT NULL DEFAULT '', 'isanchor' tinyint(4) unsigned NOT NULL DEFAULT '0', PRIMARY KEY ('id','t_ns'), KEY 't_s' ('t_s'), KEY 't_ns' ('t_ns') ) ENGINE=MyISAM AUTO_INCREMENT=2128295174 DEFAULT CHARSET=latin1 /* !50100 PARTITION BY RANGE (t_ns) (PARTITION 19_02_2015_23_59 VALUES LESS THAN (1424386799000000000) ENGINE = MyISAM, PARTITION 20_02_2015_23_59 VALUES LESS THAN (1424473199000000000) ENGINE = MyISAM, PARTITION 21_02_2015_23_59 VALUES LESS THAN (1424559599000000000) ENGINE = MyISAM, PARTITION 22_02_2015_23_59 VALUES LESS THAN (1424645999000000000) ENGINE = MyISAM, PARTITION 23_02_2015_23_59 VALUES LESS THAN (1424732399000000000) ENGINE = MyISAM, PARTITION 24_02_2015_23_59 VALUES LESS THAN (1424818799000000000) ENGINE = MyISAM, PARTITION 25_02_2015_23_59 VALUES LESS THAN (1424905199000000000) ENGINE = MyISAM, PARTITION 05_03_2015_23_59 VALUES LESS THAN (1425596399000000000) ENGINE = MyISAM, PARTITION 13_03_2015_23_59 VALUES LESS THAN (1426287599000000000) ENGINE = MyISAM, PARTITION 14_03_2015_23_59 VALUES LESS THAN (1426373999000000000) ENGINE = MyISAM, PARTITION 15_03_2015_23_59 VALUES LESS THAN (1426460399000000000) ENGINE = MyISAM, PARTITION 16_03_2015_23_59 VALUES LESS THAN (1426546799000000000) ENGINE = MyISAM, PARTITION 17_03_2015_23_59 VALUES LESS THAN (1426633199000000000) ENGINE = MyISAM, PARTITION 18_03_2015_23_59 VALUES LESS THAN (1426719599000000000) ENGINE = MyISAM) */

系统当前每秒最多将 4000 个参数记录到数据库中(不同的表,在存储过程中决定哪个表)。每 5 分钟、1 小时和每天调用不同的脚本来分析日志数据,在此期间数据被写入表中。这导致现在有些沉重的负载。从 MyISAM 切换到 InnoDB(或其他)是否有可能提高性能?

感谢您的帮助!

【问题讨论】:

  • 这一切都取决于数据的结构、您需要如何使用它以及您拥有的索引类型。我们需要更多信息。
  • Questions asking us to recommend or find a book, tool, software library, tutorial or other off-site resource are off-topic for Stack Overflow[...]. 除此之外,如果您只是插入和读取,但不更新数据,这通常用于记录数据,那么您不需要事务,您可以使用 MyISAM理论上更快,因为它不关心该功能。
  • 无法用更多细节来回答这个问题,但是......一般来说,myisam 会比 innodb 更快,因为它是一个“有限”的引擎。没有外键,这消除了很多开销。另一方面,innodb 支持行级锁,而 myisam 只有表锁。
  • @BenM 我添加了更多信息,您还想知道什么?我很乐意提供任何信息,但我真的不知道你必须知道什么才能做出决定

标签: mysql logging innodb myisam


【解决方案1】:

用于快速记录并随后进行分析...

  1. 将数据收集到没有索引的 MyISAM 表中。 5 分钟后(120 万行!):
  2. 将其分析为 InnoDB“汇总表”。
  3. 删除表或截断表。

分析将被放入其他表中。这些将包含摘要信息并且小于 120 万行。

要获取每小时数据,请汇总汇总表。但不要创建“每小时”表;只需根据需要获取并重新计算。

以下是一些相关讨论:High speed ingestionSummary Tables

【讨论】:

  • 我刚刚在星期五看到了你的 HowTos,我目前正试图将它应用到我的数据库中。您知道是否可以(或容易)从临时表向我的数据库添加分区? ALTER TABLE t1 EXCHANGE PARTITION p WITH t2 或类似的东西?
  • 这是对我的 HowTo 的一个有趣的“改进”。但我将不得不仔细考虑。一些初步的想法:(1)在临时表上强制使用相同的模式; (2) #1 所需的任何索引都会减慢插入速度; (3) 可能(将)导致大量分区,从而产生其他性能问题; (4) 等等??
  • 1) 确实如此,但是在我的情况下,事实表包含进来的所有内容(这也不是最佳的)。 2)这在性能方面应该是可能的。也许这只有在事实表需要很少的索引(1,也许是 2)时才有效。 3) 我为 7 天的表计算了超过 2000 个分区。也许mergetables在这里会更好? 4)我在系统中有很多备用性能,因为不再在一张表上工作(在同一个 myisam 表上插入和选择),我节省了很多
  • 2000 个分区本身就是一个问题。 PARTITION 的性能在超过 50 个分区时不太好。在某些情况下,查询会在意识到只需要一个分区之前打开所有分区。 MERGE 十多年来几乎没有得到任何支持;我不会去那里。
  • 如果你也有纳秒,为什么还要有秒和毫秒? (这将摆脱一个索引)
猜你喜欢
  • 2011-05-14
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 2012-10-20
  • 2020-02-21
  • 1970-01-01
相关资源
最近更新 更多