单个SELECT查询的InnoDB隔离级别

时间:2014-08-02 18:02:25

标签: mysql sql transactions modeling isolation-level

我知道发送到MySQL的每个查询(使用InnoDB作为引擎)都是作为单独的事务进行的。但是我担心的是默认隔离级别(可重复读取)。

我的问题是:当逐个发送SELECT查询时,需要使事务处于可重复读取状态?在这种情况下,InnoDB不会增加任何开销吗?

例如,在我的Web应用程序中,我有很多单个读取查询,但准确性并不重要:例如,即使正在处理某些修改,我也可以在给定时间检索书籍数量,因为我确切地知道这个数字可以在我的HTTP请求之后发展。

在这种情况下,READ UNCOMMITED似乎是合适的。我是否需要将每个类似的单一事务请求转换为这样的ISOLATION LEVEL或InnoDB自动处理它?<​​/ p>

感谢。

1 个答案:

答案 0 :(得分:1)

首先,您的问题是更广泛的主题重新性能调整的一部分。这样很难回答 - 只知道这一点。但我试着给你至少一些概述。

Repeatable Read对于大多数数据库来说已经足够好了,但这并不意味着它对你来说也是最好的!这真是真的!

顺便说一下,我认为只有在MySQL中这是默认的这个级别。在大多数数据库中,这是在Read Committed(例如Oracle)。在我看来,这对大多数情况来说已经足够了。

  

我的问题是:当SELECT查询逐个发送时,需要什么   使事务处于可重复读取状态?

基本上没必要。可重复读取级别确保您不允许脏读,不允许重复读取和幻像行(但这可能是一个不同的故事)。基本上这些是你运行DML的时候。所以当只查询纯粹的SELECTs时,这根本不适用于。

  

在这种情况下,InnoDB不会增加任何开销吗?

另一个是的。它没有做任何事情。一般而言,InnoDB中的ACID模型的代价是始终存储数据而不会对数据可靠性产生任何怀疑。这不是免费的。它只是在性能和​​数据一致性和可靠性之间进行权衡。

更详细地说,MySQL使用特殊段来存储快照和旧行值以进行回滚。并在必要时提及它们。正如我所说的那样。 但值得一提的是,在执行INSERT,UPDATE,DELETE时,性能增加/减少更为明显。 SELECT不会花费太多。但仍然。

如果你不需要这样做,这在理论上是显而易见的好处。多大?您需要自己进行评估,以衡量您环境中的查询性能。

因为很多还取决于个人包括。规模,有多少读/写,频率,参考应用程序设计,数据库等等。

在不同的环境中遇到同样的问题,答案可能会有所不同。

您可以考虑的另一个替代方案是简单地将引擎更改为MyISAM(例如,如果您不需要任何外键)。根据我的经验,它是重读需求的非常好的选择。所有依赖 - 但在许多情况下比InnoDB更快。当然不那么安全,但如果你意识到可能的威胁 - 这是很好的解决方案。

  

在这种情况下,READ UNCOMMITED似乎是合适的。我需要转弯吗?   每个类似的事务 - 单一请求到这样的ISOLATION LEVEL   或InnoDB自动处理它?<​​/ p>

您可以为全局,当前会话或下一个事务设置隔离级别。 为下一个会话全局设置您的交易级别。

SET GLOBAL tx_isolation = 'READ-UNCOMMITTED';

http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html