普通索引 与 唯一索引
唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n)。
非主键的都是二级索引, 二级索引又包括了唯一索引和普通索引
1、普通索引
- 普通索引 -> 由关键字KEY或INDEX定义的索引
- 作用 : 普通索引的唯一任务是加快对数据的访问速度
- 适用场景 :
- 查询条件为(WHERE column)
- 排序条件为(ORDER BY column)中的数据列创建索引
- 只要有可能,就应该选择一个数据最整齐、最紧凑的数据列来创建索引。
2、唯一索引
- 普通索引允许被索引的数据列包含重复的值
- 如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。
- 优点 :
- 一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;
- 二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。
- 唯一索引可以保证数据记录的唯一性
- 事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
3、在不同业务情况下 唯一索引 与 普通索引 的选择
场景 : 维护与一个市民系统 :
-
每一个人都有对应的且唯一的身份证号码, 而且业务代码保证不会写入两个重复的身份证号码, 如果需要查询市民的姓名, 就会执行类似下面的 SQL 语句 :
select name from CityUser where id_card = 'xxxxxxxyyyyyyzzzzz';
-
id_card 索引建立考虑
- id_card 字段创建唯一索引
- 创建一个普通索引
-
在逻辑上, 这两个选择都是正确的, 但在性能方面该如何做出选择呢 ?
查询过程
- 执行查询的语句
select id