MySQL在UNIQUE NOT NULL列上创建索引

时间:2012-11-11 20:28:14

标签: mysql indexing database

我读到某个地方不应该在表的列上创建很多索引,因为它会降低操作的性能。

但是当我创建一个带有UNIQUE NOT NULL字段的表时,MySQL正在自己创建所有字段的索引。这不会降低性能吗?如果是,我需要更改默认行为的标志是什么?如果没有,那么我错了?

我的表:

CREATE TABLE Users(
Id_usr INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(Id_usr),
Email_id varchar(45) UNIQUE NOT NULL,
username varchar(30) UNIQUE NOT NULL,
userpass varchar(30) NOT NULL
);

当我在phpmyadmin上看到表格时:

Indexes: Documentation
Action  Keyname Type    Unique  Packed  Column  Cardinality Collation   Null    Comment
Edit Edit   Drop Drop   PRIMARY BTREE   Yes No  Id_usr  0   A       
Edit Edit   Drop Drop   Email_id    BTREE   Yes No  Email_id    0   A       
Edit Edit   Drop Drop   username    BTREE   Yes No  username    0   A       

2 个答案:

答案 0 :(得分:1)

性能下降是由于需要在写入时更新索引。另一方面,创建指数以加速选择。

如果没有创建索引在每次插入或更新时扫描整个表格,

MySQL无法强制执行唯一性,这会对性能影响更大。幸运的是,你无法改变这种行为。

答案 1 :(得分:1)

  

但是当我创建一个包含UNIQUE NOT NULL字段的表时,MySQL会自动在所有字段上创建索引。

不,Mysql只在你告诉它的那些字段上创建索引。 当您在末尾创建一个UNIQUE的列时,这意味着您要告诉mysql在该列上添加UNIQUE索引

因此,对于两个UNIQUE列,有两个索引。对于主键,有一个索引。共有3个指数。 userpass列没有索引。因为你没有告诉它。

如果您需要索引并且知道为什么需要UNIQUE索引,那么只需添加它即可。不要考虑现在的表现。部署后,如果遇到任何性能问题,请考虑优化。