非唯一索引也叫普通索引

如果在一个列上同时建唯一索引和普通索引的话,mysql 会自动选择唯一索引 唯一索引和普通索引使用的结构都是 B-tree,执行时间复杂度都是 O(log n)

普通索引(非唯一索引)

普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column =)或排序条件(ORDER BY column)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

唯一索引

普通索引允许被索引的数据列包含重复的值

如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字 UNIQUE 把它定义为一个唯一索引。这么做的好处:一是简化了 MySQL 对这个索引的管理工作,这个索引也因此而变得更有效率(区分度:distinct * / count (*) 高);二是 MySQL 会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL 将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

主键索引

主键索引是唯一索引的特殊类型

数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键 在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据

它们的一些比较:

  1. 对于主键 MySQL 会自动建立唯一索引;

  2. 主键不一定只包含一个字段,所以可以在主键的其中一个字段建唯一索引;

  3. 主键可作外键,唯一索引不可;

  4. 主键不可为空,唯一索引可;

  5. 主键也可是多个字段的组合;

主键与唯一索引不同的是:

  1. 有not null属性;

  2. 每个表只能有一个。