MySQL 如何快速查出缺失数据的主键 id

2017-12-08 14:14:56 +08:00
 LiuXuFei
MySQL 如何快速查出缺失数据的主键 id

例如,有如下数据:
id 1,3,7,8,10

如何快速查出缺失的:
2,4,5,9

数据有千万条的情况。
5063 次点击
所在节点    MySQL
10 条回复
paragon
2017-12-08 14:18:53 +08:00
最好的方法是只插不删啊~
icemanpro
2017-12-08 14:54:36 +08:00
二分?
finull
2017-12-08 15:17:15 +08:00
数据量大的情况下,最有效率的方法还是再构造一个只有 id 的表,值从 1 到现在的最大的 id,关联查询获取缺少的 ID

直接查询的方式可以参考这里: https://stackoverflow.com/questions/12325132/mysql-get-missing-ids-from-table
realpg
2017-12-08 15:18:40 +08:00
千万,就算一个亿好了,直接挨个循环搜索 int 主键看返回结果也用不了多久
realpg
2017-12-08 15:20:30 +08:00
在地铁上不好打字 如果非要技巧的方法,回家我给你个办法 要求有权限使用临时中间表
zhx1991
2017-12-08 15:35:37 +08:00
笨办法, 挨个循环看
my3157
2017-12-08 15:35:58 +08:00
@finull #3 https://www.codediesel.com/mysql/sequence-gaps-in-mysql/

Finding missing numbers in a sequence

Finding if a sequence has gaps is easy, finding the exact list of missing numbers is a little involved. The following query lists the missing numbers from a given auto-increment column.

```
SELECT a.id+1 AS start, MIN(b.id) - 1 AS end
FROM testtable AS a, testtable AS b
WHERE a.id < b.id
GROUP BY a.id
HAVING start < MIN(b.id)
```
LiuXuFei
2017-12-08 15:46:37 +08:00
笨办法,太笨,不合适哈。
数据如果缺失,有个定时任务随时采集需要加入的。
realpg
2017-12-08 16:08:00 +08:00
@LiuXuFei #8
你这个亿以下量级 随便用编程语言笨办法做一个 执行时间一点也不长 还没有写入操作不影响服务器,其实是最优解

用所谓的聪明办法 无论啥办法 基本都绕不过中间表,插入数据写入一个一千万行的临时表耗时基本都是 4 分钟起的……
LiuXuFei
2017-12-08 16:18:44 +08:00
@finull
@my3157 数据多好像很慢。

算了,换一种方式,多采集几次,笨办法加一些条件应该就可以了。

谢谢楼上各位的解答。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/413098

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX