【问题标题】:Isolation level for single SELECT query with PHP mysqli_query使用 PHP mysqli_query 进行单个 SELECT 查询的隔离级别
【发布时间】:2014-08-03 22:53:56
【问题描述】:

我有一个带有一张表的 InnoDB 数据库,book。此外,我有一个 PHP 脚本,其中包含一个查询,用于显示此类 book 表中的书籍数量:

SELECT COUNT(*) FROM book

如您所知,使用 mysqli 扩展,可以使用 mysqli_begin_transaction 创建事务。接下来,可以定义隔离级别。

就我而言,我不需要与事务相关的函数,我使用 mysqli_query,因为它只是一个 SELECT 查询。但是,我知道即使是单个查询也包含在 MySQL 事务中,并且默认隔离级别是 REPEATABLE READ。

问题就在这里:我不希望只执行这样的单个查询就产生 REPEATABLE READ 开销。 READ UNCOMMITTED 就足够了。

问题:mysqli_extension 是否会自动检测我正在使用单个 SELECT 查询(因为我没有开始任何事务)并自动将隔离级别设置为 READ UNCOMMITTED(或最多 READ COMMITED)还是我需要定义一个包装类以在执行此类事务-with-only-one-SELECT-query 之前始终设置 READ UNCOMMITTED 隔离级别?

非常感谢。

【问题讨论】:

  • 这是一个真正的问题还是您正在解决一个虚构的问题?
  • 我不知道你为什么认为这是一个虚构的问题。我的示例被简化以显示原理,但当然,这是一个真正的问题。我希望我的 web 应用程序有最好的性能,它做了很多这样的 SELECT-single-query。所以我认为当我完全不需要 REPEATABLE READ 时使用 READ UNCOMMITED 而不是 REPEATABLE READ 可以是一个好的开始,通过删除任何 REPEATABLE READ 开销来减轻我的 MySQL 数据库。所以,我的问题是:PHP/MySQLi 扩展如何在隔离级别方面处理这种单 SELECT 查询情况?谢谢。
  • “我想要最好的性能”——这就是我问性能的原因。您能衡量使用不同隔离级别之间的区别吗?
  • 我不能轻易测量:要知道真正的全局增益,我需要将所有相关的 mysqli_query 转换为 mysqli_begin_transaction 方案(正确隔离级别)在我的生产服务器中的 PHP 源上。这就是为什么我只想知道当我使用一个 SELECT 查询调用 mysqli_query 时 mysqli 扩展是否自动设置了 READ UNCOMMITED 隔离级别。在这种情况下,我什至不必在这方面做任何改变,我可以尝试通过其他方式减少负载。
  • 如果你不能测量它 - 你怎么知道优化成功了?你无法处理你无法衡量的东西。这就是性能优化 101

标签: php mysql mysqli transactions isolation-level


【解决方案1】:

不,mysqli_query 不会自动更改隔离级别。通过 mysqli 连接在很多方面就像通过 mysql cli 连接一样。在这两种情况下,您都将获得默认的隔离级别。就像 cli 一样,mysqli 无法对将通过连接发出的语句做出任何假设。

无论如何,如果您有充分的理由担心隔离级别,我认为您应该明确设置它,例如:

$mysqli_connection->query("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");

这样您可以确保您拥有所需的隔离级别,并且您可以在代码中注释您的原因。

【讨论】:

  • 不客气。但是,如果您出于性能问题而对此进行调查,我怀疑这会有很大帮助。在这里检查这个:stackoverflow.com/questions/2719269/… 此外,innodb 的某些方面依赖于硬件/操作系统配置。例如,您可能想检查 my.cnf 中的 innodb_flush_method 在一个安装(我无法控制硬件/操作系统)中,我最终设置了 innodb_flush_log_at_trx_commit=0 和 innodb_flush_method=O_DSYNC 并看到增加了 1000 倍
  • 在性能方面。但是,我不建议将这些设置用于高度敏感的数据。我会因为丢失数据的设置而崩溃。
猜你喜欢
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2018-08-04
  • 1970-01-01
  • 2015-08-19
相关资源
最近更新 更多