2014-09-05 100 views
4

MySQL中的表是MyISAM。锁定MyISAM表(MySQL)和PHP

现在我想选择许多数据。

$res = $db->query("SELECT ..."); 
// -- Break 1 
while($row = $res->fetch_assoc()) { 
//working with the row; 
} 
// -- Break 2 

什么时候表上的锁结束?在休息1还是休息2?

+2

这是一个很好的和深入的关于表锁的阅读:http://dev.mysql.com/doc/refman/5.1/en/internal-locking.html – 2014-09-05 13:30:54

+0

也许分析SQL给了一些关于何时mysql freeing table。[详细说明](http://dev.mysql.com/doc/refman/5.5/en/show-profile.html) – 2014-09-05 13:34:24

+0

没有锁定。 – sectus 2014-09-05 13:37:31

回答

0

@bauer据我了解你的问题。接近我的答案是,无论何时使用while循环,并且您有一个资源对象或变量用于迭代,它只在页面上执行一次,因为一旦迭代完成,对象或相应变量就会自由并且包含null,所以为了运行while循环,你需要定义不同的obj,而不管你的结果集是什么。

0

// - Break 1

数据在此行之前的过程中加载。表被释放。

从这一点进一步的数据操作是在PHP应用程序中,不再需要数据库中的数据。

至于先前的评论,没有数据锁定,这取决于你的观点。如果您的查询快速返回两条记录,则会显示没有锁定(技术上不正确,但很容易弄错)。但是,如果你的查询很复杂,而且你的结果很庞大,那么需要一些时间才能返回结果(比如45秒),那么MyISAM中确实存在一个表锁的情况将变得非常明显。在45秒内返回一个简单的“显示过程列表”清楚地显示锁定的表格。 (等待表级锁定是一种死亡赠品)。在较大的Vicidial装置上每天都会发生。

索引表可以减少锁定时间。设置“限制50”(某些数字限制结果数据集)可以缩短锁定时间,如果这也是查询的可行选项。

另请注意,锁定有一些绕过的方法,这取决于试图“播放”的查询。选择vs插入vs更新通常可以相互绕过(这就是锁定机制的研究可以派上用场的地方)。测试是确定你理解它的好主意。不要害怕创建一个包含3000万条记录的表,并运行一个巨大的查询来查看选择/插入/更新之间的锁和什么,而其中一个是巨大的,另一个是微小的,试图“玩”,而大一个正在运行。即使您认为自己“明白了”,结果也会让您大吃一惊。然后注意显式声明查询不太重要的能力,以及后续查询旋转它们的类型时会发生什么。