【问题标题】:Preferable index structure in mysql tablemysql表中的首选索引结构
【发布时间】:2016-03-11 22:10:48
【问题描述】:

我有以下数据库结构:

  • 身份证
  • 姓名
  • 导演
  • 运行时

示例条目为:(1, "Titanic", 1994, "James Cameron", 02:44:00)

我想通过四个条件中的任何三个来查找匹配项,例如:

1. name + year + director
2. name + year + runtime
3. year + director + runtime

如果我创建了一个索引,是否足以优化查询?

ALTER TABLE myTable ADD INDEX (name, year, director, runtime)

或者,我需要为每个组合创建一个索引吗?

ALTER TABLE myTable ADD INDEX (name, year, director)
ALTER TABLE myTable ADD INDEX (name, year, runtime)
ALTER TABLE myTable ADD INDEX (year, director, runtime)

我显然更喜欢使用第一个,但这里建议使用哪个?为什么一个比另一个更可取?这是一个 InnoDB 表。

【问题讨论】:

  • 您可以在所有 4 列上添加 FULLTEXT 索引并在 BOOLEAN MODE 中使用 WHERE MATCH(all 4 columns) AGAINST (words) 进行搜索
  • @Mihai 我正在使用 InnoDB。
  • 在 5.6 或更高版本上,您可以在 innoDB 上使用 FULLTEXT

标签: mysql sql


【解决方案1】:

考虑到id 是具有默认唯一索引的主键;如果您创建一个包含 4 列的索引,这足以导致在这种情况下您得到的是 Covering Index

ALTER TABLE myTable ADD INDEX (name, year, director, runtime)

【讨论】:

  • 感谢您的解释,您能否解释一下Covering Index 是什么以及它有什么用处?
  • 覆盖索引是指查询中选择的所有字段都被索引覆盖的情况,在这种情况下,InnoDB(不是 MyISAM)永远不会读取表,但只使用索引中的数据,大大加快了选择速度。
  • 此搜索 year + director + runtime 不会使用您的索引
  • @Mihai 为什么不呢?
猜你喜欢
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
相关资源
最近更新 更多