数据库引擎内部

时间:2012-01-01 06:07:56

标签: sql database

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

2 个答案:

答案 0 :(得分:3)

为了保持完整性,每次交易完成后都需要进行写入 执行COMMIT语句时完成事务 单个事务中可能有许多语句(SELECT,INSERT,UPDATE& DELETE) 仅在打开和关闭时写入不会为ACID交易提供足够的支持。

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

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

答案 1 :(得分:2)

它比文件系统与RAM讨论要复杂得多。 MS SQL Server有详细记录的数据存储方法(我确信MySQL也是如此,不确定Access)。我将从我对MS SQL Server的经验中回答。

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

对您的问题进行一些了解:

  

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

  • 数据库引擎绝对使用RAM来提高性能,特别是对于读取(包括索引)。通常(并非总是)读取的数量大于写入次数,即使在OLTP环境中也是如此。读数据实际上比写数据要昂贵得多;但是,写入数据会带来导致锁定的惩罚,这可能会产生重大影响。

  • 实际的缓冲实现因数据库而异,也可能取决于是否正在使用事务来写入数据。有些事情是数据库引擎必须考虑的,例如,如果另一个调用者请求脏读?或者如果系统在操作过程中出现故障怎么办?如果数据库服务器是群集或复制的,该怎么办?这并不意味着这是不可能的,只是它是一个复杂的问题。

  • 完整性保证的一个示例:在MS SQL Server镜像环境中,可以使用充当证人的第三个服务器写入两个服务器。写入可以是异步的,或者可以同步写入,这要求双方都能成功继续。这样做速度较慢,但​​保证(在合理范围内)数据实际上已发送到两个节点,并且两个节点都确信它们的持久性操作成功。

  • 连接通常是合并的,而不是真正关闭,因为打开和关闭非常昂贵。连接可以(并且经常应该)被主动重用(无论是否合并)。

我发现这篇关于MS SQL Server缓冲区写的文章很有意思:http://msdn.microsoft.com/en-us/library/aa337525.aspx

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

相关问题