我有一张名为“世界”的桌子。它有一些空ID:
id - data
1 - ...
2 - ...
(no 3,4 IDs after 2)
5 - ...
我有一个查询来选择此表中最低的未使用ID。它看起来像:
SELECT MIN(t1.id)
FROM
(
SELECT 1 AS id
UNION ALL
SELECT id + 1
FROM world
) t1
LEFT OUTER JOIN world t2
ON t1.id = t2.id
WHERE t2.id IS NULL;
我想找到一种方法来改进这个查询,使其执行得更快。
答案 0 :(得分:3)
您可以这样做:
select (w.id + 1)
from world w left join
world w2
on w.id = w2.id - 1
where w2.id is null
order by w.id
limit 1
这应该具有合理的性能,索引在world(id)
。
同一SQL
的SQLFiddle答案 1 :(得分:0)
这将在第一次使用之后为您提供第一个未使用的ID(即,如果它未被使用,它将不会给你ID 1,但是其余的将用于此。)
SELECT id + 1 FROM world WHERE (id + 1) NOT IN (
SELECT id FROM world
) ORDER BY id ASC LIMIT 1
要包含ID 1,您可以先进行特定检查,看是否存在,或执行以下操作:
SELECT IF(
NOT EXISTS(SELECT id FROM world WHERE id = 1),
1,
(SELECT id + 1 FROM world WHERE (id + 1) NOT IN (
SELECT id FROM world
) ORDER BY id ASC LIMIT 1)
) AS min_unused