MySQL表mytable
结构是:
Name - param1 - param2 - param3 - param4 - param5 - ... - param20.
param<number>
具有布尔类型(TINYINT(1))
假设我想执行查询:
SELECT Name FROM mytable WHERE param4=1 AND param7=1;
一切都按预期工作。
如果我对效果感到好奇,那么将汇总列params
代替param1, param2, ... param20
可以吗?
为此,我将所有布尔参数存储为一个整数。
例如,72 = 64+8 = 0+0*2+0*4+1*8+0*16+0*32+1*64+0+...+0
会对应
param4=true
和param7=true
,
所有其他人都是false
。这很容易。
但是,这会显着影响Select查询的性能,以提取与上述查询相同的行吗? 我相信查询将是
SELECT Name FROM mytable WHERE (params % 16 = 8) AND (params % 128 = 64);
我认为聚合值(结果只有两列)更好,但性能如何呢?
有任何陷阱吗?
谢谢。
答案 0 :(得分:1)
即使非常有经验的DBA也在估算查询中函数和运算符的CPU成本。为了获得最佳性能,请保持简单。如果出于任何原因,将来您必须进行大规模查询或具有更高计算复杂度的查询;处理一个简单的模数可能是一个性能问题。
答案 1 :(得分:1)
当然,位操作的一个问题是,如果将来某个时候您的数据库会从索引这些值中获益,那么您有点卡住了。
除非你有一个非常令人信服的理由,否则我会说与单独的领域相关。该数据库旨在跟踪不同的信息 - 我们不应该尝试用另一种方法来打动它 - 它已经过优化,可以跟踪不同列中的不同信息。