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

标签 mysql sql database database-design

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/

相关文章:

mysql - MySQL 中 SQL 脚本的默认数据库

mysql - MySQL 数据库中的最大表数

mysql - 获取内容的最旧日期并检查第二个表中的相同数据

php - MYSQL从数据库检索数据时如何忽略foreach循环中的重复行

php - saveAll() 的 CakePHP 问题

database - Lucene 查询语法搜索

mysql - 如何修复 SQL 中的外键错误

Mysql字节长度

java-生成id(字符串和整数的组合)

mysql - 如何计算一个表中不同行和列之间的timestampdiff?