查询Azure表中最新项目的最快方法?

13 azure azure-table-storage

我有一个Azure表,客户发布消息,单个表中可能有数百万条消息.我想找到最快的方式来获取最近10分钟内发布的消息(这是我刷新网页的频率).由于只对分区键编制索引,因此我使用了将消息作为分区键发布的日期和时间的想法,例如字符串作为ISO8601日期格式,如"2009-06-15T13:45:30.0900000"

伪代码示例:

var message = "Hello word!";
var messagePartitionKey = DateTime.Now.ToString("o");
var messageEntity = new MessageEntity(messagePartitionKey, message);
dataSource.Insert(messageEntity);
Run Code Online (Sandbox Code Playgroud)

,然后查询最近10分钟内发布的消息,如下所示(未经测试的伪代码):

// Get the date and time 10 minutes ago
var tenMinutesAgo = DateTime.Now.Subtract(new TimeSpan(0, 10, 0)).ToString("o");

// Query for the latest messages
var latestMessages = (from t in
   context.Messages
   where t.PartitionKey.CompareTo(tenMinutesAgo) <= 0
   select t
   )
Run Code Online (Sandbox Code Playgroud)

但这个指数会很好吗?或者它会导致全表扫描?有人有更好的想法吗?我知道每个表项都有一个时间戳,但它没有编入索引,所以它对我来说太慢了.

kni*_*hor 6

我认为你有正确的基本想法.您设计的查询应该尽可能高效.但是我可以提供一些改进.

而不是使用DateTime.Now,使用Date.UtcNow.根据我的理解实例设置为使用Utc时间作为他们的基础,但这只是确保你比较苹果和苹果,你可以可靠地将时间转换回你想要的任何时区显示它们.

而不是将时间存储为.ToString("o")将时间转换为刻度并存储时间,您最终会减少格式化问题(有时您最终会获得时区规范,有时不会).此外,如果您总是希望看到从最近到最旧排序的这些消息,您可以从最大刻度数中减去刻度数,例如

var messagePartitionKey = (DateTime.MaxValue.Ticks - _contactDate.Ticks).ToString("d19");
Run Code Online (Sandbox Code Playgroud)

指定行键也是一个好主意.虽然两个消息极不可能在完全相同的时间发布,但这并非不可能.如果您没有明显的行键,那么只需将其设置为Guid即可.