想要改进SQL查询

时间:2015-07-06 11:37:53

标签: mysql sql

我有一张名为“世界”的桌子。它有一些空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;

我想找到一种方法来改进这个查询,使其执行得更快。

2 个答案:

答案 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