【发布时间】: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