假设我有一个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
谢谢!
答案 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'表示它没有被标记。