mysql好像只提供了primary,unique,key,fulltext,spatial四种索引。但是我想知道如何为那些不唯一但经常被索引的列声明索引?因为我的数据库服务器遇到了瓶颈,我想为经常索引的列创建索引。
如有任何帮助,我们将不胜感激。提前致谢。
最佳答案
请区分“key”和“index”。
前者是逻辑概念(限制,因此改变了数据的含义),后者是物理概念(不改变含义,但可以改变性能)1。
让我们弄清楚基本概念:
- “ super 键”是任何组合在一起的唯一属性集。
- “候选键”(或只是“键”)是最小的 super 键 - 如果您从它身上拿走任何属性,它就不再是唯一的。
- 所有键在逻辑上都是等价的,但出于实际2和历史原因,我们选择其中一个作为“主键”,其余称为“备用键”。
- 在数据库中,您使用 PRIMARY KEY 约束声明主键,并在 NOT NULL 字段上使用 UNIQUE 约束声明备用键。
- 大多数 DBMS(MySQL 也不异常(exception))会自动在键下创建索引。尽管如此,它们仍然是独立的概念,一些 DBMS 实际上允许您拥有一个没有索引的键。
不幸的是,MySQL 把术语搞乱了:
- MySQL 使用 column 约束 KEY 作为 PRIMARY KEY 的同义词。
- MySQL 使用 table 约束 KEY 作为索引,不是 键,如果您使用 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主键上的表。
关于mysql - 如何在 mysql 中声明二级或非唯一索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23525790/