MyISAM与InnoDB
我要说的是一个涉及大量数据库写入的项目(70%的插入和30%的读取)。该比率还包括我认为是一次读取和一次写入的更新。读取内容可能很脏(例如,读取时我不需要100%准确的信息)。
有问题的任务将是每小时进行超过一百万次数据库事务。
我已经在网上阅读了很多有关MyISAM和InnoDB之间差异的内容,对于我将用于此任务的特定数据库/表,MyISAM似乎是我的明显选择。从我似乎正在阅读的内容来看,如果需要事务,则InnoDB很好,因为它支持行级锁定。
是否有人对这种负载(或者更高负载)有任何经验? MyISAM是要走的路吗?
解决方案
回答
我不是数据库专家,我也不凭经验说话。然而:
MyISAM表使用表级锁定。根据流量估算,每秒将近200次写入。使用MyISAM,任何时候都只能进行其中之一。我们必须确保硬件可以跟上这些事务,以避免被超载,即,单个查询最多可以花费5毫秒。
对我来说,这表明我们需要一个支持行级锁定的存储引擎,即InnoDB。
另一方面,编写一些简单的脚本来模拟每个存储引擎的负载,然后比较结果应该是相当简单的。
回答
每个应用程序都有其自己的使用数据库的性能配置文件,并且随着时间的推移,它很可能会发生变化。
我们可以做的最好的事情就是测试选择。在MyISAM和InnoDB之间切换很简单,因此请加载一些测试数据并针对站点启动jmeter,然后看看会发生什么。
回答
如果使用MyISAM,则不会每小时进行任何事务,除非我们将每个DML语句视为一个事务(在任何情况下,如果发生崩溃,它都不会持久或者原子)。
因此,我认为我们必须使用InnoDB。
每秒300个事务听起来很多。如果我们绝对需要这些事务在断电时能够持久运行,请确保I / O子系统每秒可以轻松处理这么多的写入。我们将至少需要一个具有电池后备缓存的RAID控制器。
如果可以减少耐用性,可以将Innodb_flush_log_at_trx_commit设置为0或者2(请参阅文档以了解详细信息)来使用InnoDB,可以提高性能。
有许多补丁程序可以提高Google的并发性,如果我们没有这些补丁程序仍无法获得足够的性能,则可能会吸引其他人。
回答
我已经在使用MySQL的高容量系统上工作,并且尝试了MyISAM和InnoDB。
我发现MyISAM中的表级锁定对我们的工作负载造成了严重的性能问题,这听起来与情况相似。不幸的是,我还发现InnoDB的性能也比我希望的要差。
最后,我通过对数据进行分段解决了争用问题,从而使插入内容进入"热"表,并选择了从不查询热表。
这也允许在"陈旧"表上进行删除(数据是时间敏感的,我们只保留了X天的时间),而选择查询仍然没有删除该表。 InnoDB在批量删除方面的性能似乎很差,因此,如果我们打算清除数据,则可能需要以一种方式构造它,即旧数据位于一个陈旧的表中,可以将其简单地删除而不是对其进行删除。
当然,我不知道应用程序是什么,但希望它可以使我们对MyISAM和InnoDB的某些问题有一些了解。
回答
对于具有更多读写操作的负载,我们将从InnoDB中受益。因为InnoDB提供行锁定而不是表锁定,所以SELECT可以是并发的,不仅可以相互并发,而且可以与许多INSERT并发。但是,除非打算使用SQL事务,否则将InnoDB提交刷新设置为2(innodb_flush_log_at_trx_commit)。这给我们带来了很多原始性能,否则我们将表从MyISAM移到InnoDB时可能会失去这些性能。
另外,请考虑添加复制。这为我们提供了一些读取扩展,并且由于我们声明读取不必是最新的,因此可以让复制落后一些。只要确保它可以在流量最大的任何情况下都可以追上,否则它将永远落后并且永远不会追上。但是,如果我们采用这种方式,我强烈建议我们将读取与从属读取隔离,并将复制滞后管理隔离到数据库处理程序。如果应用程序代码不知道这一点,则非常简单。
最后,要注意不同的表负载。我们不会在所有表上具有相同的读/写比率。一些读取率接近100%的较小桌子可以负担得起MyISAM。同样,如果我们有一些接近100%写入的表,则可能会受益于" INSERT DELAYED",但这仅在MyISAM中受支持(对于InnoDB表,将忽略" DELAYED"子句)。
但是可以确定基准。
回答
以我的经验,只要我们不执行DELETE,UPDATE,大量单个INSERT,事务和全文本索引,MyISAM是一个更好的选择。顺便说一句,检查表是可怕的。随着表在行数上的变老,我们不知道它什么时候结束。
回答
myisam是用于这种类型的工作负载(高并发写入)的NOGO,我没有使用innodb的丰富经验(对其进行了3次测试,发现每种情况下性能都很糟糕,但是自上次测试以来已经有一段时间了)
如果我们不被迫运行mysql,请考虑尝试一下postgres,因为它可以更好地处理并发写入
回答
对于这样的读写比,我猜想InnoDB的性能会更好。
由于我们可以接受脏读,因此,我们可以(如果负担得起)将其复制到从属服务器,然后将所有读取内容发送给该从属服务器。另外,请考虑批量插入,而不是一次插入一条记录。
回答
我认为这是一篇出色的文章,解释了这些差异以及何时应该使用它们之间的区别:
http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB
回答
我发现即使Myisam具有锁定争用,但由于Myisam使用了快速锁定获取方案,因此在大多数情况下它仍比InnoDb快。我已经尝试了几次Innodb,但总是出于某种原因退回到MyIsam。而且,InnoDB在巨大的写入负载中可能会占用大量CPU。