mysql性能:将一行中的布尔值(标志)存储为聚合数字?

时间:2014-10-16 09:51:06

标签: mysql sql performance select boolean

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=trueparam7=true, 所有其他人都是false。这很容易。

但是,这会显着影响Select查询的性能,以提取与上述查询相同的行吗? 我相信查询将是

SELECT Name FROM mytable WHERE (params % 16 = 8) AND (params % 128 = 64);

我认为聚合值(结果只有两列)更好,但性能如何呢?

有任何陷阱吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

即使非常有经验的DBA也在估算查询中函数和运算符的CPU成本。为了获得最佳性能,请保持简单。如果出于任何原因,将来您必须进行大规模查询或具有更高计算复杂度的查询;处理一个简单的模数可能是一个性能问题。

答案 1 :(得分:1)

当然,位操作的一个问题是,如果将来某个时候您的数据库会从索引这些值中获益,那么您有点卡住了。

除非你有一个非常令人信服的理由,否则我会说与单独的领域相关。该数据库旨在跟踪不同的信息 - 我们不应该尝试用另一种方法来打动它 - 它已经过优化,可以跟踪不同列中的不同信息。