我有一个包含排序数据的大型 MySQL 表。当我需要找到起点时,我会执行二分搜索来查找下限 ID(自动递增)。唯一的问题是,一旦删除了某些数据,如果算法给出的 ID 不存在,我需要查看具有较低 ID 的第一个现有行。我应该如何修改此代码才能实现这一目标?
$l = 1;
$h = $max; //SELECT MAX(id)
while ($h - $l > 1){
$m = ($h + $l) / 2;
$q = mysqli_query($db, "SELECT col FROM tab WHERE id=". floor($m));
$result = array();
while($result[] = mysqli_fetch_row($q)){;}
if ($result[0][0] < $val) $l = $m;
else $h = $m;
}
echo round($m);
例如,我想查找哪些行的 col 值大于 12345,并且表的最大 ID 为 10000。我首先查看第 5000 行,其中 col = 9000,然后是 7500 (col = 13000),然后6250 已被删除,因此我开始查找 ID < 6250 的第一个现有行,我发现 6245 的 col = 10500。现在我正在 ID 6873 和 7500 等之间查找。
最佳答案
执行此操作的正确方法
所以你有一个像这样的表:
| ID | col |
---------------
| 1 | 15 |
| 3 | 155 |
| 18 | 9231|
| 190 |14343|
| 500 |16888|
您可以使用以下查询找到 14343:
SELECT ID, col FROM the_table WHERE col>12345 LIMIT 1;
为了加快速度,您需要添加索引(索引词值得谷歌搜索)
ALTER TABLE `the_table` ADD INDEX `col` (`col`);
之后mysql将在内部创建一个树结构,并且将为您对其进行二进制搜索。
这将工作得更快,因为您将避免多次网络往返以及每个请求的其他费用(查询解析、优化、所有锁和互斥体,...)
回答你的问题
I need to look at the first existing row with a lower ID
例如您想要获取 ID < 300 的第一行,您可以这样做(限制是使查询仅返回 1 个结果):
SELECT col FROM the_table WHERE ID < 300 LIMIT 1;
关于mysql - PHP 在 MySQL 表中进行二分查找并删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40614481/