最快的RowKey查询

本文关键字:查询 RowKey | 更新日期: 2023-09-27 18:14:45

我们所有的表实体的RowKey都有自己的types。
例如在User表中:

PK: yahoo.com  
RK: U_user1       ----------- the kind is 'U' it means User
PK: yahoo.com  
RK: U_user2  
PK: yahoo.com  
RK: U_user3  
PK: Store1  
RK: M_user4       ----------- the kind is 'M' it means Merchant  
PK: Store1  
RK: M_user5
PK: Store1  
RK: M_user6  
PK: Store2  
RK: M_user7  

如果我想在不知道PartitionKey的情况下搜索所有用户,我将这样做:

Azure存储资源管理器:

RowKey gt 'U_' and RowKey lt 'V_'  

In Linq:

var list = from e in dao.Table()
   where string.Compare(e.RowKey, "U_") > 0 && string.Compare(e.RowKey, "V_") < 0
   select e;  

我现在的问题是,如果记录变大,它还会很快吗?或者我应该把Kind放在PartitionKey中?但要做到这一点并不容易。

这篇文章说:
http://blog.maartenballiauw.be/post/2012/10/08/What-PartitionKey-and-RowKey-are-for-in-Windows-Azure-Table-Storage.aspx

Less fast: querying on only RowKey. Doing this will give table storage no pointer on  
which partition to search in, resulting in a query that possibly spans multiple partitions,  
possibly multiple storage nodes as well. Wihtin a partition, searching on RowKey is still  
pretty fast as it’s a unique index.  

编辑

我刚刚做了一些测试:

PK: M_Sample  
RK: GUID  
500 records  

PK: Sample  
RK: U_GUID  
500 records  

使用这些查询:

PartitionKey gt 'M_' and PartitionKey lt 'N_'      --- 26 seconds  
RowKey gt 'U_' and RowKey lt 'V_'               ----- 36 seconds

它表明,我必须使用PartitionKey作为搜索键

最快的RowKey查询

我现在的问题是,如果记录变大,它还会很快吗?或我应该把Kind放在PartitionKey中吗?但这样做是不会的容易。

不,因为您的查询正在进行全表扫描。您必须在您的查询中包含PartitionKey以获得最快的性能。

不确定这是否有帮助,但在我们的项目中,我们正在采取不同的方法。因此,如果我以上面的示例为例,我们为每个用户存储两条记录(或者换句话说,我们正在对数据进行反规范化):

  1. 分区键= yahoo.com;RowKey = U_user1
  2. PartitionKey = U_user1;RowKey = yahoo.com

根据我们想要查询用户的方式,我们选择两个标准中的一个。