2015-07-06 50 views
0

我有一个名为“世界”的表。它有一些空的ID:想改善SQL查询

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

这是关系到你的其他两个问题[MySQL表的复杂订货] (http://stackoverflow.com/questions/31232740/complicated-reorder-of-mysql-tables)和[MySQL表重新排序](http://stackoverflow.com/questions/31231851/mysql-table-reorder)? – Abecee

回答

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)指数合理的性能。

SQLFiddle为同一SQL

+1

对于那些想尝试的人,请参阅** sqlfiddle ** http://sqlfiddle.com/#!9/e2080/1/0 – Pholochtairze

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