繁体   English   中英

锁定MyISAM表(MySQL)和PHP

[英]Lock at MyISAM Table (MySQL) and PHP

MySQL中的表是MyISAM。

现在我想选择许多数据。

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

桌子上的锁何时结束? 在休息1或休息2?

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

// - 休息1

在此行之前的过程中加载数据。 表已发布。

此时进一步的数据操作是在PHP应用程序中,不再需要来自数据库的数据。

至于之前没有数据锁定的评论,这取决于你的观点。 如果您的查询快速返回两个记录,则看起来没有锁(技术上不正确,但很容易弄错)。 但是如果你的查询很复杂并且你的结果设置很大,这需要一些重要的时间来返回结果(例如,大约45秒),那么在MyISAM中确实存在表锁定将变得非常明显。 在45秒返回期间,一个简单的“show processlist”清楚地显示了锁定表。 (等待桌面锁定是一种死亡的赠品)。 每天都会发生在较大的Vicidial设施上。

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

另请注意,锁定有一些旁路方法,具体取决于尝试“播放”的查询。 选择vs插入vs更新通常可以相互绕过(这是研究锁定机制可以派上用场的地方)。 测试是一个好主意,以确保你理解它。 永远不要害怕在其中创建一个包含3000万条记录的表,并运行一个巨大的查询来查看选择/插入/更新之间的锁和什么不存在,而其中一个是巨大的而另一个很小并且试图在“大玩”时一个正在运行。 即使你认为你“得到它”,结果也会让你感到惊讶。 然后观察能否明确声明查询不太重要以及后续查询轮换其类型时会发生什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM