MySQL学习笔记-3-索引
来源:SegmentFault
时间:2023-01-22 07:43:16 381浏览 收藏
IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《MySQL学习笔记-3-索引》,聊聊MySQL,我们一起来看看吧!
I、索引的一些基本概念
索引就是数据结构
索引是为了提高数据查询效率
例子:字典。里面的声母查询方式就是聚簇索引。偏旁部首就是二级索引,偏旁部首+笔画就是联合索引。
II、常见索引模型
模型 | 表列 B | 场景 | 场景 |
---|---|---|---|
哈希表 | 键-值(类比hashmap) | 等值查询 | 不能范围查询 |
有序数组 | 按顺序存储,用二分法查询 | 静态存储引擎 | 查询效率高,更新效率低 |
搜索树 | 每个节点的左儿子小于父节点,父节点又小于右儿子 | 等值和范围查询 | 数高过高,读写磁盘次数过多 |
InnoDB使用B+Tree索引。 InnoDB的表结构:1.在InnoDB中,每一张表其实就是多个B+树,即一个主键索引树和多个非主键索引树。2.执行查询的效率,使用主键索引>使用非主键索引>不使用索引。3.如果不使用索引进行查询,则从主索引B+树的叶子节点进行遍历。
III、索引类型
索引 | 存储方式 | 区别 |
---|---|---|
主键索引(聚簇索引) | 叶子节点存的是整行的数据 | 只要搜索ID这个B+Tree即可拿到数据 |
非主键索引(二级索引) | 叶子节点内容是主键的值 | 先搜索索引拿到主键值,再到主键索引树搜索一次 |
从性能和存储空间方面考量,推荐使用自增主键,就可以保证新的ID一定是在叶子节点最右边,不会影响前面的数据。
IV、B+Tree索引维护
一个数据页满了,按照B+Tree算法,新增加一个数据页,叫做页分裂,会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。
需要复习一下二叉树、红黑树、B+树等数据结构
V、覆盖索引、前缀索引和索引下推
1、覆盖索引:如果查询条件使用的是普通索引(或是联合索引的最左原则字段),查询结果是联合索引的字段或是主键,不用回表操作,直接返回结果,减少IO磁盘读写读取正行数据
2、最左前缀:联合索引的最左N个字段,也可以是字符串索引的最左M个字符(MYSQL做词法分析语法分析的时候是通过建立最左子树来建立语法树的,解析的过程也是从左到右所以遵循最左前缀的原则。)
3、联合索引:根据创建联合索引的顺序,以最左原则进行where检索,比如(age,name)以age=1 或 age= 1 and name=‘张三’可以使用索引,单以name=‘张三’ 不会使用索引,考虑到存储空间的问题,还请根据业务需求,将查找频繁的数据进行靠左创建索引。比如一个联合索引(a,b,c),其实质是按a,b,c的顺序拼接成了一个二进制字节数组,索引记录是按该字节数组逐字节比较排序的,所以其是先按a排序,再按b排序,再按c排序的,至于其为什么是按最左前缀匹配的也就显而易见了。
4、索引下推:like 'hello%’and age >10 检索,MySQL5.6版本之前,会对匹配的数据进行回表查询。5.6版本后,会先过滤掉age
VI、mysql军规
给表创建索引时,应该创建哪些索引,每个索引应该包含哪些字段,字段的顺序怎么排列,这个问题没有标准答案,需要根据具体的业务来做权衡。不过有些思路还是可供参考的:
1.既然是一个权衡问题,没有办法保证所有的查询都高效,那就要优先保证高频的查询高效,较低频次的查询也尽可能的使用到尽可能长的最左前缀索引。可以借助pt-query-digest来采样统计业务查询语句的访问频度,可能需要迭代几次才能确定联合索引的最终字段及其排序。
2.业务是在演进的,所以索引也是要随着业务演进的,并不是索引建好了就万事大吉了,业务发生变化时,我们需要重新审视当初建的索引是不是还依然高效,依然能满足业务需求。
3.业内流传的有一些mysql军规,其实这些并不是真正的军规,只是典型场景下的最佳实践。真正的军规其实就一条:高效的满足业务需求。比如有个军规规定一个表上的索引数不超过5个,但如果我们现在有一些历史数据表、历史日志表,我们很明确的知道这些表上不会再有数据写入了,但我们的查询需求很多也很多样化,那我们在这些表上的索引数能不能超过5个?当然是没有任何问题的。当然关于这份军规还是要认真看一下的,但看的重点不是去记住它,而是要弄明白每一条军规它为什么这么规定,它这样规定是基于什么考虑,适用的场景和前提是什么,这些都弄明白了,你记不记得住这些军规都无所谓了,因为你已经把它溶化到了你的血液中,具体到自己的具体业务时游刃有余将是必然。
今天关于《MySQL学习笔记-3-索引》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
-
499 收藏
-
244 收藏
-
235 收藏
-
157 收藏
-
101 收藏
-
387 收藏
-
197 收藏
-
207 收藏
-
133 收藏
-
120 收藏
-
274 收藏
-
203 收藏
-
195 收藏
-
396 收藏
-
473 收藏
-
356 收藏
-
267 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 虚心的钢笔
- 这篇文章太及时了,很详细,很有用,mark,关注师傅了!希望师傅能多写数据库相关的文章。
- 2023-04-06 13:30:59
-
- 端庄的大炮
- 受益颇多,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢师傅分享技术文章!
- 2023-02-06 14:41:52
-
- 悦耳的小猫咪
- 很好,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢作者分享文章内容!
- 2023-02-06 01:12:24
-
- 可爱的天空
- 太详细了,码起来,感谢师傅的这篇文章,我会继续支持!
- 2023-02-02 17:05:51
-
- 善良的台灯
- 这篇技术贴真是及时雨啊,很详细,赞 👍👍,已加入收藏夹了,关注楼主了!希望楼主能多写数据库相关的文章。
- 2023-01-27 01:52:44
-
- 故意的芹菜
- 这篇技术贴真是及时雨啊,楼主加油!
- 2023-01-24 22:45:22