我在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=0id>$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/

10-11 22:28
查看更多