很多写,但很少读 - 什么Mysql存储引擎使用?

时间:2009-04-09 02:44:14

标签: mysql database storage

我想知道是否有人建议使用哪种存储引擎。程序需要对数据库执行大量写操作,但读取次数很少。

[edit]无需外键。数据很简单,但它需要非常快速地执行写入。

4 个答案:

答案 0 :(得分:3)

来自jpipes

  

MyISAM和表级锁

     

与采用行级的InnoDB不同   锁定,MyISAM使用了很多   粗粒度锁定系统   确保将数据写入   受保护的数据文件。   表级锁定是唯一的级别   锁定MyISAM,这有一个   夫妻后果:

     
      
  • 对MyISAM表发出UPDATE或DELETE的任何连接都将   请求一个独家写锁   MyISAM表。如果没有其他锁(读   或写)目前被放置在   表,独占写锁是   授予和所有其他连接   发出任何形式的要求(DDL,   SELECT,UPDATE,INSERT,DELETE)必须   等到线程用了   独占写锁更新   它需要的记录然后   释放写锁。
  •   
  • 由于只有表级锁,因此没有能力(就像那里一样)   是与InnoDB)只锁定一个或一个   一小组记录,允许其他   线程从其他部分SELECT   表数据。
  •   

关键是,对于写入,InnoDB更好,因为它将锁定更少的资源并使更多的并行操作/请求发生。

答案 1 :(得分:1)

“它需要非常快速地执行写入”是一个模糊的要求。无论您做什么,写入都可能因数据库中的争用而延迟。如果您的应用程序在将审计记录写入数据库时​​不需要阻止,您应该使审计写入异步并将您自己的审计数据队列保存在光盘或内存中(这样您就不会阻止主工作线程/进程)

InnoDB可能允许并发插入,但这并不意味着它们不会因索引页面之类的资源或内部锁争用而被阻止。

MyISAM在以下情况下允许使用一个插入器和多个读取器(“并发插入”):

  • 桌子上没有“洞”
  • 没有线程尝试执行UPDATE或DELETE

如果您有一个仅附加表,您每天都会重新创建(或者如果您使用5.1分区,则每天创建一个新分区),您可能会侥幸成功。

MyISAM并发插入大多非常好,如果你可以使用它们。

编写审核记录时,如果可能,请一次执行几个 - 这适用于您使用的任何存储引擎。审计过程最好“批量”记录并一次插入几个。

答案 2 :(得分:0)

你真的没有给我们足够的信息来提出一个考虑的建议 - 你想要使用外键吗?行级锁定?页面级锁定?交易?

作为一般规则,如果要使用事务,InnoDB / BerkeleyDB。如果你不这样做,MyISAM。

答案 3 :(得分:0)

根据我的经验,MyISAM非常适合快速写入,只要在插入后,它就是只读的。它会比我熟悉的任何其他选项(包括支持索引)更快地追加更快的速度。

但是一旦你开始删除记录或更新索引键,并且它需要重新填充空洞(在表格或索引中),讨论会变得更加复杂。

对于经典的日志类型或日记类型表,它非常高兴。