MySQL性能: store Boolean values (flags) in one row as an aggregated number or not?

标签 mysql sql performance select boolean

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=trueparam7=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/

相关文章:

python - 比较 Python 中的(函数的)求根算法

javascript - NodeJS 和 MySQL 中标记系统的 3 个表更新的最佳方法

php - 当名称属性在数组中时,如何确定按下了哪个提交按钮?

sql - 能够获取 BigQuery 中每个数组条目的 "index"(或序数值)吗?

c++ - QSqlQuery禁止非SELECT查询

r - 在第一个非 NA 值之后递归填充元素

Mysql 用聚合和注释表

php - 优化这个mysql查询

sql - 如何使用sql server获取ISOweek以及全年每周的开始和结束日期

android - 如何有效地更新 Android textviews?