关于唯一索引和普通索引的抉择
想象这样一个场景,在设计一张用户表时,每人的身份证号是唯一的,需要搜索。但由于身份证号字段较大,不好将其作为主键。在业务代码已经保证插入身份证唯一的情况下,可以选择建立唯一索引和普通普通索引,这时该如何选择呢?接下来,将从查询和更新的执行过程进行分析。 查询过程 假设 k 是表 t 上的索引,在搜索 select id from t where k=5 时,会先从 k 这棵 B+ 的树根开始,按层搜索叶子节点,找到 k=5 的数据页,然后在数据页内容进行二分法定位。 对于普通索引,找到 k=5 的记录后,会继续向下查找一个,直到碰到第一个不是 5 的记录结束。 对于唯一索引,由于取值唯一,找到后直接停止。 由于 InnoDB 是按照数据页为单位(数据页默认 16 KB)进行读写的,在读取一条数据时, 会将整个数据页整体读到内存。 在读入内存的数据页中,如果包含 k=5 的记录,在查询的情况下,唯一索引比普通索引多了一次查找和判断的过程,可以忽略。 如果 k=5 是当前数据页的最后一条,就需要在读取下一个数据页。但这发生的概率较低,也可以忽略。 所以总得来说,普通索引和唯一索引在查询的过程中差异不大。 change buffer 在分析唯一索引和普通索引的影响前,先来认识一下 change buffer 这个结构。 什么是 change buffer ? 在执行更新操作时