首页 > 解决方案 > 使用多个 BIT(1) 字段改进 Mysql 查询

问题描述

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

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

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

标签: mysqlperformance

解决方案


对于单个布尔列:

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

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

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


推荐阅读