我正在研究涉及大量数据库写入的项目,我会说( 70%的插入和 30%的读取 )。该比率还包括我认为是一次读取和一次写入的更新。读取可能很脏(例如,在读取时我不需要 100%准确的信息)。
有问题的任务将是每小时进行超过 100 万次数据库事务。
我在网上看到了一些关于 MyISAM 和 InnoDB 之间差异的东西,对于我将用于此任务的特定数据库 / 表格来说,MyISAM 似乎是我的明显选择。从我似乎正在阅读的内容来看,如果需要事务处理,InnoDB 很好,因为支持行级锁定。
有没有人有这种负载(或更高)的经验? MyISAM 是走的路吗?
我在表格中简要讨论了这个问题,因此您可以得出结论是否与InnoDB或MyISAM一起使用。
以下是您应该在哪种情况下使用哪个数据库存储引擎的小概述:
MyISAM InnoDB ---------------------------------------------------------------- Required full-text search Yes 5.6.4 ---------------------------------------------------------------- Require transactions Yes ---------------------------------------------------------------- Frequent select queries Yes ---------------------------------------------------------------- Frequent insert, update, delete Yes ---------------------------------------------------------------- Row locking (multi processing on single table) Yes ---------------------------------------------------------------- Relational base design Yes
总结一下:
Frequent reading, almost no writing => MyISAM Full-text search in MySQL <= 5.5 => MyISAM
在所有其他情况下, InnoDB通常是最好的方式。
我不是数据库专家,我不会从经验中说话。然而:
MyISAM 表使用表级锁定 。根据您的流量估算值,您每秒接近 200 次写入。使用 MyISAM,其中只有一个可以随时进行 。您必须确保您的硬件能够跟上这些事务以避免被溢出,即单个查询可能不会超过 5 毫秒。
这对我来说,你需要一个支持行级锁定的存储引擎,即 InnoDB。
另一方面,编写一些简单的脚本来模拟每个存储引擎的负载应该是相当简单的,然后比较结果。
人们经常谈论性能,读取与写入,外键等等,但在我看来,存储引擎还有另外一个必备功能: 原子更新。
试试这个:
killall -9 mysqld
来模拟崩溃,这仍然有效。 当然,性能是可取的,但不要丢失数据应该胜过它。