MySQL在唯一非空列上创建索引

MySQL在唯一非空列上创建索引,mysql,indexing,database,Mysql,Indexing,Database,我在某个地方读到,不应该在表的列上创建很多索引,因为这样会降低操作的性能 但是,当我创建一个具有唯一非空字段的表时,MySQL会自己在所有字段上创建索引。这不会降低性能吗??如果是,我需要哪些标志来更改默认行为?如果不是,那我错在哪里 我的桌子: CREATE TABLE Users( Id_usr INT UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY(Id_usr), Email_id varchar(45) UNIQUE NOT NULL, us

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

但是,当我创建一个具有唯一非空字段的表时,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       

性能降低是由于写入时需要更新索引。另一方面,创建索引是为了加快选择

MySQL
如果不在每次插入或更新时创建索引或扫描整个表,就无法强制执行唯一性,这将对性能造成更糟糕的影响。幸运的是,你无法改变这种行为

但是,当我创建一个具有唯一非空字段的表时,MySQL会自己在所有字段上创建索引

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

因此,对于两个唯一的列,有两个索引。主键有一个索引。共3项指标
userpass
列没有索引。因为你没有告诉我


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

索引是一种权衡。它们减慢了表写入操作(即插入和更新),同时加快了读取操作(即选择、重复检查等)。如果希望MySQL对列强制执行唯一性约束,那么在该列上创建索引是正确的方法。不要过早地对附加索引的成本进行微观优化,除非/直到您意识到这正在成为一个问题。索引的一般经验法则是将索引添加到
where
join
order by
中使用的任何字段上。索引有助于加快搜索速度,但代价是降低插入/更新速度。如果您只将字段用作存储位置,则不要为其编制索引。