对于一个新的开发,我将有一个大的SQL表(~100M行)。 将使用4个字段来查询数据。
用一个或几个等于查询一个连接字段是否更好?
例如:
MainTable
PkId | Label | FkId1 | FkId2 | FkId3 | FkId4 1 | test | 1 | 4 | 3 | 1
Fk表中的数据是静态的,例如:
FkTable1
Id | Value 1 | a 2 | b 3 | c
要查询数据,经典的sql查询是:
select Label, FkId1, FkId2, FkId3, FkId4
from MainTable
where FkId1=1 and FkId2=2 and FkId3 in(2, 3)
优化性能的想法是在插入之前添加一个字段“UniqueId”计算后端:
UniqueId = FkId1*1000000 + FkId2*10000 + FkId3*100 + FkId4
PkId | Label | FkId1 | FkId2 | FkId3 | FkId4 | UniqueId 1 | test | 1 | 4 | 3 | 1 | 1040301
select Label, FkId1, FkId2, FkId3, FkId4
from MainTable
where UniqueId between 1020200 and 1040000
此外,使用UniqueId字段,仅此字段的索引就足够了。
您怎么看?
由于
答案 0 :(得分:3)
对于此查询:
select Label, FkId1, FkId2, FkId3, FkId4
from MainTable
where FkId1 = 1 and FkId2 = 2 and FkId3 in (2, 3)
最佳索引位于MainTable(FkID1, FkId2, FkId3)
。如果需要覆盖索引,也可以将Label
和FkId4
添加到索引(因此索引可以处理整个查询而不引用原始数据页)。
您提供的示例不需要计算字段。
答案 1 :(得分:0)
由于你将拥有100M行,从一开始就考虑优化对我来说是明智的。 但是,您建议的解决方案不会以这种方式工作:
上面的公式是相同系数10000的两倍。您必须使用不同的因素,即10的不同幂。
您的选择示例包含" IN"条款((2,3)中的FkId3)。只有通过这种方式查询其中一个FK时,这才有效。这个fk应该是计算UniqueId的公式中没有因子的那个(即给出UniqueId的最低有效数字)。
现在看到戈登回答,我同意他的意见,即使用综合指数对你来说可能已经足够了(尽管你的解决方案可能稍好一些)。但是,组合索引也有类似的问题:使用IN子句查询的FK字段应该是索引中的最后一个字段。