mysql - PHP 在 MySQL 表中进行二分查找并删除行

标签 mysql binary-search

我有一个包含排序数据的大型 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/

相关文章:

php - mysql获取具有可用结构中关系的记录

mysql - 删除受另一个查询影响的记录

arrays - 在紧密排序的元素数组中搜索元素的最坏情况时间复杂度?

java - 循环/搜索数组直到特定索引

big-o - 什么大 O 方程描述了我的搜索?

mysql - 在非常慢的服务器 2 上替代内连接

mysql - 如果MySQL中某个字段被更新,如何从相关表中删除?

mysql - 非聚合分组列是否需要 HAVING?

arrays - 穷举搜索与排序后的二进制搜索

java - 二进制搜索和文件读取进入无限循环