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