mysql - SET 列上的索引有用吗?

标签 mysql database postgresql database-design

以下问题特别倾向于 MySQL 和 PostgreSQL,但我也对有关其他数据库系统的答案感兴趣。

我正在设计一个数据库和 SET column在少数情况下,type 似乎符合要求。一个这样的例子可以表示为一周中每一天的 bool 列,我正在考虑使用 MySQL's SET , SET('周日','周一','周二','周三','周四','周五','周六')

是这样一个索引 SET column有用?它会加快搜索与一周中的每一天相匹配的行的速度吗?星期几的特定组合?或者它只会加快搜索字段的完整精确二进制值(例如周一/周三/周五的 0101010)?

最佳答案

使用 PostgreSQL

从逻辑上讲,如果您只想测试 =,二进制解决方案是最快的。但是,这没什么用。

如果不是,您最好将它们存储为

  1. 一个枚举数组,
  2. 就像单独的 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/

相关文章:

php - 双向更新后的mysql触发器

MySQL WHERE 条件字符串到数组

php - 无法显示来自 mySQL 服务器的数据

ruby-on-rails - Dockerise rails/redis/sidekiq/postgres 项目

sql - 如何将postgres 12生成的sql文件恢复到postgres 9.6数据库中

PostgreSQL 计算 3 个连接的百分比

mysql - MySQL 是否为启用弹性数据存储提供 native 支持?

python - Django 通过连接进行排序的效率 - 我可以强制使用子查询吗?

mysql - MYSQL 5.7 中的 native JSON 支持 : what are the pros and cons of JSON data type in MYSQL?

java - 无法从 CursorWindow 错误中读取第 0 行、第 -1 列