我想知道是否有人对使用哪种存储引擎有建议。程序需要对数据库执行大量写入,但读取很少。
[编辑] 不需要外键。数据很简单,但它需要非常快速地执行写入。
从jpipes:
MyISAM 和表级锁
与采用行级锁定的 InnoDB 不同,MyISAM 使用更粗粒度的锁定系统来确保数据以受保护的方式写入数据文件。表级锁定是 MyISAM 的唯一锁定级别,这有几个后果:
- 任何对 MyISAM 表发出 UPDATE 或 DELETE 的连接都将请求对 MyISAM 表的排他写锁。如果当前没有在表上放置其他锁(读或写),则授予独占写锁,并且所有其他发出任何类型(DDL、SELECT、UPDATE、INSERT、DELETE)请求的连接必须等到具有独占写锁的线程写锁更新它需要的记录,然后释放写锁。
- 由于只有表级锁,因此无法(像 InnoDB 那样)只锁定一个或一小组记录,从而允许其他线程从表数据的其他部分进行 SELECT。
关键是,对于编写而言,InnoDB 更好,因为它会锁定更少的资源并允许发生更多的并行操作/请求。
“它需要非常快地执行写入”是一个模糊的要求。无论您做什么,写入都可能因数据库中的争用而延迟。如果您的应用程序在将审计记录写入数据库时不需要阻塞,您应该使审计写入异步并将您自己的审计数据队列保留在磁盘或内存中(这样您就不会阻塞主工作线程/进程)
InnoDB 可能允许并发插入,但这并不意味着它们不会被资源争用或索引页等内部锁阻塞。
MyISAM 在以下情况下允许一个插入器和多个读取器(“并发插入”):
如果您有一个仅附加表,并且您每天都重新创建它(或者如果您使用 5.1 分区,则每天都创建一个新分区),您可能会侥幸成功。
MyISAM 并发插入大多非常好,如果您可以使用它们。
编写审计记录时,如果可能,一次执行多个 - 这适用于您使用的任何存储引擎。审计过程“批量”记录并一次插入多个记录是一个好主意。
您还没有真正向我们提供足够的信息来提出深思熟虑的建议 - 您想使用外键吗?行级锁定?页面级锁定?交易?
作为一般规则,如果你想使用事务,InnoDB/BerkeleyDB。如果你不这样做,MyISAM。
根据我的经验,MyISAM 非常适合快速写入,只要插入后它是只读的。它会比我熟悉的任何其他选项(包括支持索引)更快地追加。
但是,一旦您开始删除记录或更新索引键,并且需要重新填充空洞(在表或索引中),讨论就会变得更加复杂。
但是,对于经典的日志类型或日志类型的表,它非常高兴。