【问题标题】:How to declare secondary or non-unique index in mysql?如何在mysql中声明二级或非唯一索引?
【发布时间】:2014-05-07 18:43:36
【问题描述】:

好像mysql只提供了四种索引,分别是primary、unique、key、fulltext和spatial。但我想知道如何为那些不是唯一但经常被索引的列声明索引?因为我的数据库服务器遇到了瓶颈,我想为经常被索引的列创建索引。

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 省略 UNIQUE 修饰符,它是一个非唯一索引。
  • keyindex 是一回事。你在谈论索引的不同属性。添加索引的经验法则是,wherejoinorder bygroup by 中使用的任何字段都应该被索引。例如在“决策”类型上下文中使用字段的任何地方。
  • 所以键是非唯一索引?

标签: mysql sql database database-design


【解决方案1】:

请区分“key”和“index”。

前者是逻辑概念(限制,因此改变数据的含义),后者是物理概念(不改变含义,但可以改变性能)1。。 p>

让我们弄清楚基本概念:

  • “超级键”是任何一组属性,它们加在一起是唯一的。
  • “候选键”(或只是“键”)是最小的超级键 - 如果您从其中移除任何属性,它就不再是唯一的。
  • 所有键在逻辑上都是等效的,但出于实际2和历史原因,我们选择其中一个作为“主键”,其余的称为“备用键”。
  • 在数据库中,您使用 PRIMARY KEY 约束声明主键,并在 NOT NULL 字段上使用 UNIQUE 约束声明备用键。
  • 大多数 DBMS(MySQL 也不例外)会在键下自动创建索引。尽管如此,它们仍然是独立的概念,并且某些 DBMS 实际上允许您拥有没有索引的键。

不幸的是,MySQL 彻底搞砸了术语:

  • MySQL 使用 column 约束 KEY 作为 PRIMARY KEY 的同义词。
  • MySQL 使用 table 约束 KEY 作为索引,not 键,与使用 CREATE INDEX 语句相同。

例如,两者都...

CREATE TABLE T (
  A INT PRIMARY KEY,
  B INT
);

CREATE INDEX T_IE1 ON T (B);

...和...

CREATE TABLE T (
  A INT KEY,
  B INT,
  KEY (B)
);

...意思相同:A 上的主键(A 上具有唯一/聚集索引)和 B 上的非唯一索引。


1 唯一索引在这里有点奇怪 - 它有点跨越两个世界。但是让我们再讨论一下吧……

2 例如,InnoDB clusters 主键上的表。

【讨论】:

  • 在第一个示例中,将 A 声明为主键,将 B 声明为唯一索引,而将 A 和 B 都声明为 Key。我可以看到它们是如何等效的。但我的问题是,如何声明一个经常被访问的非唯一列作为 mysql 中的索引?就像会议的开始时间一样——它可能与其他会议完全一样,但我们经常会在 where/order by/group by 子句中使用它。
  • @user3216886 “B 作为唯一索引” - 不,我没有,请重新阅读答案。 “但我的问题是,我如何声明一个非唯一列作为 mysql 中的索引经常被访问?” 通过使用表级(不是列级)KEY 或 CREATE INDEX,如显示在答案中。
  • 哦,我明白了——我想我所做的一切都是在桌面级别上。所以表级的“键”就像一个索引。我们如何区分什么是表级和什么是列级?在我的 GUI 应用程序中,我只需右键单击所需的列并在“创建索引”下选择一个选项。 A 在第一个示例中是 PRIMARY KEY,但 is KEY 是第二个示例,但它们都是主键,这意味着它们是列级的。但我不太明白如何区分列级和表级的键创建。
  • @user3216886 A INT KEY 是列级的。 KEY (B) 是表级别的。使用了相同的关键字,但它们的含义不同。
  • 哇。我不知道。只是为了确保我做对了,A INT KEY 使 A 成为主键和索引,而 KEY (B) 使其成为非唯一索引?
猜你喜欢
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2014-08-15
  • 2012-07-10
  • 2014-09-30
相关资源
最近更新 更多