mysql - 使用多个 BIT(1) 字段改进 Mysql 查询
问题描述
我正在运行一些查询,这些查询使用 WHERE 子句中的几个 BIT(1) 字段来更新一些表,除了来自 INT 字段的其他条件,这些条件主要是值列表。但是,在 EXPLAIN 命令中,我看到引擎首先使用 INT 字段而不是 BIT(1) 字段来扫描表。
虽然不依赖 BIT(1) 字段是可以理解的,因为这只会在平均情况下将扫描缩短一半,但我知道只有少数行实际上会填充 BIT(1) 结果(如“待定”与几乎所有行都“关闭”的“关闭”相比)这样会更有效率。
有没有办法编写查询以使 MySQL 引擎首先使用 BIT(1) 条件?由于查询中使用了几个 BIT(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
在所有这些情况下,您都可以同时操作或测试多个位。
进一步描述您的应用程序,包括数据和查询。也许我们可以提供进一步的建议。
推荐阅读
- caching - Cache-Control 默认是公共的还是私有的?
- node.js - 在 NodeJs 中上传和读取 excel 文件
- python - 按python中的另一个list.index对压缩列表进行排序
- javascript - 从 Firebase 获取用户个人资料信息时出现问题
- r - 拆分和重组数据帧时如何保留单个观察的行名?
- javascript - Angular - 无法获取父组件数据
- android - Nativescript,无法在设备上进行更改。错误是:无法读取 null 的属性“startsWith”
- javascript - 在与按钮相同的 div 块中获取跨度的内部文本
- reactjs - 如何在单个反应 js 组件中导出两个模块?
- c - C中的哈希宏定义