本文内容为博主对极客时间《MySQL 实战45讲》的学习笔记:原文链接:https://time.geekbang.org/column/article/70848
假设需要维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的SQL语句:
select name from CUser where id_card = 'xxxxxxxyyyyyyyzzzzzz';
所以,你一定在考虑在 id_card 字段上建索引。
由于身份证号字段比较大,不建议你把身份证号当作主键,那么现在可以有两个选择:
1、给 id_card 字段创建一个唯一索引;
2、给 id_card 字段创建一个普通索引。
因为业务代码已经保证了不会写入重复的身份证号,那么两个选择逻辑上都是正确的。
那么,从性能的角度考虑,我们应该选择唯一索引还是普通索引呢?
这里还是用前面索引的概述文章中的例子,假设字段 k 上的值都不重复:
那么,下面我们就从这两种索引对查询语句和更新语句的性能影响来进行分析。
-
查询过程
假设,执行查询的语句是:
select id from T where k = 5;
这个查询语句在索引树上查找的过程,先是通过 B+ 树从书根开始,按层搜索到叶子节点,也就是上图中右下角的这个数据页,然后可以认为数据页内部通过二分法来定位记录。
1、对于普通索引来说,查找到满足条件的第一个记录(5,500)后,需要查找下一个记录,知道碰到第一个不满足 k = 5 条件的记录;
2、对于唯一索引来说,由于索引定义了唯一性,