【搞定MySQL数据库】第9篇:普通索引和唯一索引,应该怎么选择?

本文分析了在MySQL中,对于非主键的身份证号字段,创建普通索引和唯一索引在性能上的区别。尽管业务已保证身份证号的唯一性,但从性能角度,两者在查询上的差异微乎其微。但在更新过程中,唯一索引由于无法使用change buffer,可能影响更新性能。建议在更新频繁且非即时查询的场景下,选择普通索引并利用change buffer提升写入速度。
摘要由CSDN通过智能技术生成

本文内容为博主对极客时间《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 上的值都不重复:

InnoDB 的索引组织结构图

那么,下面我们就从这两种索引对查询语句和更新语句的性能影响来进行分析。

  • 查询过程

假设,执行查询的语句是:

select id from T where k = 5;

这个查询语句在索引树上查找的过程,先是通过 B+ 树从书根开始,按层搜索到叶子节点,也就是上图中右下角的这个数据页,然后可以认为数据页内部通过二分法来定位记录。

1、对于普通索引来说,查找到满足条件的第一个记录(5,500)后,需要查找下一个记录,知道碰到第一个不满足 k = 5 条件的记录;

2、对于唯一索引来说,由于索引定义了唯一性,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值