场景
1、维护一个市民系统,有一个字段为身份证号
2、业务代码能保证不会写入两个重复的身份证号(如果业务无法保证,可以依赖数据库的唯一索引来进行约束)
3、常用SQL查询语句:SELECT name FROM CUser WHERE id_card = 'XXX'
4、建立索引
- 身份证号比较大,不建议设置为主键
- 从性能角度出发,选择普通索引还是唯一索引?
假设字段k上的值都不重复
查询过程
1、查询语句:SELECT id FROM T WHERE k=5
2、查询过程
- 通过B+树从树根开始,按层搜索到叶子节点,即上图中右下角的数据页
- 在数据页内部通过二分法来定位具体的记录
3、针对普通索引
- 查找满足条件的第一个记录(5,500),然后查找下一个记录,直到找到第一个不满足k=5的记录
4、针对唯一索引
- 由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续查找
性能差异
1、性能差异:微乎其微
2、InnoDB的数据是按照数据页为单位进行读写的,默认为16KB
3、当需要读取一条记录时,并不是将这个记录本身从磁盘读出来,而是以数据页为单位进行读取的
4、当找到k=5的记录时,它所在的数据页都已经在内存里了
5、对于普通索引而言,只需要多一次指针寻找和多一次计算 – CPU消耗很低
- 如果k=5这个记录恰好是所在数据页的最后一个记录,那么如果要取下一个记录,就需要读取下一个数据页
- 概率很低:对于整型字段索引,一个数据页(16KB,compact格式)可以存放大概745个值
change buffer
1、当需要更新一个数据页时,如果数据页在内存中就直接更新
2、如果这个数据页不在内存中,在不影响数据一致性的前提下
- InnoDB会将这些更新操作缓存在change buffer
- 不需要从磁盘读入这个数据页(随机读)
- 在下次查询需要访问这个数据页的时候,将数据页读入内存
然后执行change buffer中与这个数据页有关的操作(merge)
3、change buffer是可以持久化的数据,在内存中有拷贝,也会被写入到磁盘上
4、将更新操作先记录在channge buffer,减少随机读磁盘,提升语句的执行速度
5、另外数据页读入内存需要占用buffer pool,使用channge buffer能避免占用内存,提高内存利用率
6、change buffer用到是buffer pool里的内存,不能无限增大,控制参数innodb_change_buffer_max_size
# 默认25,最大50
mysql> SHOW VARIABLES LIKE '%innodb_change_buffer_max_size%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| innodb_change_buffer_max_size | 25 |
+-------------------------------+-------+
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1142
183.71 KB下载数642
644.84 KB下载数2755