哪一个更快/更好的SQL练习?

时间:2010-03-25 12:42:53

标签: sql query-optimization

假设我有一个2列表(id,flag),id是顺序的。 我希望这个表包含很多记录。 我想定期选择未标记的第一行并更新它。路上的一些记录可能已被标记,所以我想跳过它们。

如果我存储我标记的最后一个id并在我的select语句中使用它会更有意义,比如

select * from mytable where id > my_last_id order by id asc limit 1

或者只是获取第一个未标记的行,例如:

select * from mytable where flagged = 'F' order by id asc limit 1

谢谢!

4 个答案:

答案 0 :(得分:3)

如果在flagged上创建索引,则检索未标记的行应该是一个即时操作。如果你总是按顺序更新它们,那么第一种方法就可以了。

答案 1 :(得分:2)

选项二是唯一有意义的,除非你知道你总是按顺序处理记录!

答案 2 :(得分:0)

假设MySQL,这一个:

SELECT  *
FROM    mytable
WHERE   flagged = 'F'
ORDER BY
        flagged ASC, id ASC
LIMIT 1
如果InnoDB上有索引,

MyISAM的效率会稍低,而(flagged, id)的效率会相同。

InnoDB表聚集在PRIMARY KEY上,因此在id中获取第一条记录不需要查找表。

MyISAM中,表是堆组织的,因此用于监管PRIMARY KEY的索引与表格分开存储。

请注意flagged子句中的ORDER BY可能看似多余,但MySQL需要选择正确的索引。

此外,复合索引应该在(flagged, id)上,即使在InnoDB中(隐含地将PRIMARY KEY包含在每个索引中)。

答案 3 :(得分:0)

您可以使用

Select Min(Id) as 'Id'
From dbo.myTable
Where Flagged='F'

假设Flagged ='F'表示它没有被标记。