我在MySQL documentation中找不到明确的答案。
当我运行查询时,类似于:
代码块1
$stmt = $db->prepare('SELECT id, name FROM table WHERE status=1');
搜索是否从表的开头开始,在
row 0
处(或最低可用行)?我想做的是一次一张桌子,然后在结束时退出。
代码块2
$curRow = 0;
while(true){
$stmt = $db->prepare('SELECT id, name FROM table WHERE status=? AND id>? LIMIT 1');
$stmt->execute(array(0, $curRow));
$result = $stmt->fetchAll();
if(count($result)){
$curRow = $result[0]['id'];
$stmt2 = $db->prepare('UPDATE table SET status=? WHERE id=?');
$stmt2->execute(array(1, $curRow));
... do some other stuff ...
}else{
exit();
}
}
到目前为止,在测试中,这完全按照预期工作。但会一直这样吗?
可能的错误情况:
从下表开始:
table
id | name | status
-- | ---- | ------
1 | ... | 0
2 | ... | 0
3 | ... | 0
4 | ... | 0
5 | ... | 0
6 | ... | 0
并在代码块2中运行查询。假设它从第一行开始,那么现在我们有了
$curRow=1
,表如下所示:table
id | name | status
-- | ---- | ------
1 | ... | 1
2 | ... | 0
3 | ... | 0
4 | ... | 0
5 | ... | 0
6 | ... | 0
一切都很好。代码做它需要做的任何事情,然后继续循环。剩余的任何行都将满足
$stmt
中的条件(即status=0
和id>$curRow
)。在检查条件时,语句是否总是查看连续的行?如果不是,它可能会在任意一行结束,比如说第三行:
table
id | name | status
-- | ---- | ------
1 | ... | 1
2 | ... | 0
3 | ... | 1
4 | ... | 0
5 | ... | 0
6 | ... | 0
现在我们有了
$curRow=3
,这意味着查询永远不会返回并查看第二行。我知道绝对地(总是,从不,每次,…)说这是一件棘手的事情,但是有没有办法确保查询从可用的最低行开始?或者MySQL会自动处理这个问题?
最佳答案
如果没有将任何可靠的顺序显式设置为键,则无法保证该顺序的可靠性。目前看来,它似乎是有序的,但随着时间的推移,随着更多的数据,可能有更多的服务器,分区数据,联合数据,它将迅速改变为一些意想不到的事情。
更好地使用ORDER BY
:
$stmt = $db->prepare('SELECT id, name FROM table WHERE status=1 ORDER BY ID ASC');
一定要在要排序的列上有一个索引,这样会加快速度!
关于php - MySQL-查询是否总是在表的开头开始搜索?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37685372/