如何在mysql中声明二级或非唯一索引?

use*_*886 2 mysql sql database database-design

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

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

Bra*_*vic 12

请区分"密钥"和"索引".

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

让我们直截了当地了解基本概念:

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

不幸的是,MySQL已经将术语搞砸了:

  • MySQL使用约束KEY作为PRIMARY KEY的同义词.
  • MySQL使用约束KEY作为索引,而不是键,如果您使用CREATE INDEX语句则相同.

例如,两者......

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

CREATE INDEX T_IE1 ON T (B);
Run Code Online (Sandbox Code Playgroud)

...和...

CREATE TABLE T (
  A INT KEY,
  B INT,
  KEY (B)
);
Run Code Online (Sandbox Code Playgroud)

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


1独特的指数在这里是一个古怪的东西 - 它跨越两个世界一点点.但让我们再讨论这个问题......

2例如,InnoDB 将表格集中在主键上.