MySQL 表 mytable
结构为:
Name - param1 - param2 - param3 - param4 - param5 - ... - param20.
param<number>
具有 boolean 类型 ( TINYINT(1) )
假设我想执行一个查询:
SELECT Name FROM mytable WHERE param4=1 AND param7=1;
一切都按预期进行。
如果我对性能感到好奇,那么可以使用聚合列 params
而不是param1, param2, ... param20
?
为此,我会将所有 boolean 参数存储为一个整数。
例如,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);
我认为聚合值(结果只有两列)更好,但是性能怎么样?
有什么陷阱吗?
谢谢。
最佳答案
当然,位操作的一个问题是,如果在将来的某个时刻您的数据库将从对这些值建立索引中受益,那么您就会陷入困境。
除非你有真正令人信服的理由不这样做,否则我会说使用单独的字段。该数据库旨在跟踪不同的信息 - 我们不应该试图用另一种方法来打动它 - 它针对跟踪不同列中的不同信息进行了优化。
关于MySQL性能: store Boolean values (flags) in one row as an aggregated number or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26401300/