首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库引擎内部

数据库引擎内部
EN

Stack Overflow用户
提问于 2012-01-01 14:07:56
回答 2查看 477关注 0票数 2

我一直在使用access和mysql...最近,我开始使用linux中的标准文件操作。由于数据库将数据存储在文件中,它们是在每个sql事务上执行文件操作,还是仅在关闭/打开数据库时执行文件操作?我认为用高效的数据结构将数据存储在ram中来处理更新,并且只写入关闭连接的文件会更有效率。我现在对关系代数不感兴趣,但是我在哪里可以找到更多的细节来回答我的问题?

EN

回答 2

Stack Overflow用户

发布于 2012-01-01 15:18:02

为了保持完整性,需要在每个事务完成后进行写入。

当执行COMMIT语句时,事务完成。

在单个事务中可能有许多语句(SELECT、INSERT、UPDATE和DELETE)。

仅在open和close上写入将不能为ACID事务提供足够的支持。

许多数据库维护单独的内部日志,目的是记录事务,写入日志是一项关键操作,日志可用于在崩溃恢复情况下重建数据库。

一些数据库实现可能选择在以后将实际实体数据持久化到磁盘,只要日志已经成功写入磁盘。

相同数据的后续读取可以从内存中的缓冲区中检索,如果在将实体数据写入磁盘之前发生崩溃,则恢复过程可以在下次启动时应用日志中的更改,从而允许数据库保持内部一致性。

票数 3
EN

Stack Overflow用户

发布于 2012-01-01 14:26:01

这比简单的文件系统与RAM的讨论复杂得多。MS SQL Server有记录良好的数据存储方法(我相信MySQL也有,但对访问不确定)。我将根据我使用MS SQL Server的经验来回答。

下面是一篇文章:http://msdn.microsoft.com/en-us/library/ms189051.aspx

围绕你的问题给出一些见解:

我认为用高效的数据结构将数据存储在ram中来处理更新,并且只写入关闭连接的文件,会更有效率。

  • 数据库引擎绝对使用内存来提高性能,尤其是在读取(包括索引)时。通常(并非总是),即使在OLTP环境中,读取的数量也会大于写入的数量。数据库引擎必须考虑一些事情,例如,如果另一个调用者请求脏读怎么办?或者,如果系统在操作过程中出现故障怎么办?如果数据库服务器是集群的或复制的,该怎么办?写入可以是异步的,或者写入可以是同步的,需要双方成功才能继续。这比较慢,但保证(在合理范围内)数据实际上已经发送到两个节点,并且两个节点都确信它们的持久性操作succeeded.
  • Connections通常是池化的,而不是真正关闭的,因为打开和关闭是相当昂贵的。连接可以(而且通常应该)被主动重用(不管是不是池化)。

我发现这篇关于MS SQL Server buffer编写的文章很有趣:http://msdn.microsoft.com/en-us/library/aa337525.aspx

它可以更具体地回答您有关何时将数据写入磁盘的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8692062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档