MySql `id` 列有一个 'PRIMARY' 和一个 'UNIQUE' 索引,这是理想的吗?

标签 mysql performance indexing unique

我在 Internet 上可以找到的所有内容都解释了这些类型的索引之间的区别,这不是我的问题。

当我在数据库中创建一个新表时,我总是创建一个 id 主键,我相信大多数人都会这样做。我总是让它成为 PRIMARY KEY, NOT NULL, UNIQUE, AUTO_INCREMENT

我最近开始大量添加自定义索引,我注意到我的 id 字段有这两个索引(自动创建,原因很明显):

There is a PRIMARY index
There is also a UNIQUE index

我的假设是由于 PK 标志(主键)自动生成了“PRIMARY”索引,并且由于 UNIQUE 标志,创建了“UNIQUE”索引。

我假设在同一列上有两个索引会增加不必要的开销。我的问题是,这是真的吗?我应该删除其中一个索引吗?或者在我的 id 列上创建这两个索引是否正常/理想?

最佳答案

PRIMARY KEY(x), UNIQUE(x) -- 因为 PRIMARY KEY定义(在 MySQL 中) UNIQUE,后面的索引是多余的,应该去掉。

此外,在 UNIQUE(x), INDEX(x) 中,INDEX(x) 是多余的。

冗余索引占用额外空间。 (在未来的版本中,它们甚至可能会被禁止——这就是它们的无用之处。)

每个表都应该(甚至“必须”)有一个PRIMARY KEY。它可以是 AUTO_INCREMENT,也可以是一些“自然”键。 “自然”的意思是它是 UNIQUE 而不是 NULL。在一个简短的调查中,我发现只有 25% 的表有 AUTO_INCREMENT 列。

More on indexing .

不要忘记考虑“复合”索引,例如 INDEX(a,b)

关于MySql `id` 列有一个 'PRIMARY' 和一个 'UNIQUE' 索引,这是理想的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35372950/

相关文章:

python - 增加列表理解中多个 for 循环的时间

MySQL - 使用 Join 进行更新突然需要很长时间

grails - 如何使用 GORM 创建复合主键?

sql-server - SQL Server 索引顺序(日期时间字段)

mysql - MySQL 中的给定列是否需要多个索引?

mysql - 将 Hive 表转换为 MySQL

PHP/SQL - 获取另一列的总和

php - 本地 WordPress 开发问题 index.php 和管理工作 - 没有其他页面响应

mysql 需要在批处理作业后每天运行优化

python - 在 numpy 中混合数组的最快方法?