以下问题特别倾向于 MySQL 和 PostgreSQL,但我也对有关其他数据库系统的答案感兴趣。
我正在设计一个数据库和 SET
column在少数情况下,type 似乎符合要求。一个这样的例子可以表示为一周中每一天的 bool 列,我正在考虑使用 MySQL's SET
, SET('周日','周一','周二','周三','周四','周五','周六')
。
是这样一个索引 SET
column有用?它会加快搜索与一周中的每一天相匹配的行的速度吗?星期几的特定组合?或者它只会加快搜索字段的完整精确二进制值(例如周一/周三/周五的 0101010
)?
最佳答案
使用 PostgreSQL
从逻辑上讲,如果您只想测试 =
,二进制解决方案是最快的。但是,这没什么用。
如果不是,您最好将它们存储为
- 一个枚举数组,
- 就像单独的 bool 字段一样简单。您甚至可以使用 bloom 索引。
在 PostgreSQL 中,您可以创建一个枚举类型,然后拥有一个枚举类型数组。索引会加快速度。
CREATE TYPE dow AS ENUM ('M', 'Tu', 'W', 'Th', 'F', 'Sa', 'Su' );
CREATE TABLE foo ( days dow[] );
这将允许您找到所有可用的星期一
SELECT * FROM foo WHERE days @> ARRAY['M']::dow[];
或者,整个星期一、星期三和星期五
SELECT * FROM foo WHERE days @> ARRAY['M','W','F']::dow[];
或者你可以让它们成为 bool 值,索引它们,然后做
SELECT * FROM foo WHERE has_monday AND has_wednesday AND has_friday;
关于mysql - SET 列上的索引有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43313498/