【问题标题】:Improving Mysql query with multiple BIT(1) fields使用多个 BIT(1) 字段改进 Mysql 查询
【发布时间】:2021-07-16 19:23:56
【问题描述】:

我正在运行一些查询,这些查询使用 WHERE 子句中的几个 BIT(1) 字段来更新一些表,除了来自 INT 字段的其他条件(主要是值列表)。但是,在 EXPLAIN 命令中,我看到引擎首先使用 INT 字段而不是 BIT(1) 字段来扫描表。

虽然不依赖 BIT(1) 字段是可以理解的,因为这只会在平均情况下将扫描时间缩短一半,但我知道只有少数行实际上会填充 BIT(1) 结果(如“待处理”与“关闭”,几乎所有行都“关闭”),这样效率会更高。

有没有办法编写查询以使 MySQL 引擎首先使用 BIT(1) 条件? 由于查询中使用了几个 BIT(1),所有这些字段的索引都有效吗?

【问题讨论】:

标签: mysql performance


【解决方案1】:

对于单个布尔列:

BIT(1) -- 1 byte
TINYINT -- 1 byte (-128..127 or 0..255)
ENUM('unknown', 'pending', 'closed') -- 1 byte, up to 255 distinct values

对于组合的几个布尔列:

TINYINT UNSIGNED -- 8 bits in 1 byte
INT UNSIGNED -- 32 bits in 4 bytes
(etc)
SET -- up to 64 bits in up to 8 bytes

在所有这些情况下,您都可以同时操作或测试多个位。

进一步描述您的应用程序,包括数据和查询。也许我们可以提供进一步的建议。

【讨论】:

    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 2011-04-03
    • 2018-08-30
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多