大厂面试官问我:Mysql B+树索引中B最后一层是双向链表还是单向链表?为什么这么设计?【后端八股文十四:Mysql索引八股文合集】

  本文为【Mysql索引八股文合集】初版,后续还会进行优化更新,欢迎大家关注交流~

hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
19d95742d45b4220ad0ae0359ffcba93.png

💥个人主页绝命Coding-优快云博客
💥 所属专栏后端技术分享
这里将会不定期更新有关后端、前端的内容,希望大家多多点赞关注收藏💖

  更多历史精彩文章(篇幅过多,不一一列出):

(简历相关)

求职经验分享(1):一份合格的简历应该如何写?-优快云博客(推荐)

求职经验分享(2):简历如何优化以及如何应对面试【后端篇】-优快云博客

(项目亮点相关)

大厂面试官赞不绝口的后端技术亮点【后端项目亮点合集(1):Redis篇】-优快云博客

大厂面试官赞不绝口的后端技术亮点【后端项目亮点合集(2)】-优快云博客
(八股文)
大厂面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文一:Redis点赞八股文合集】_java中redis如何实现点赞-优快云博客

大厂面试官问我:布隆过滤器有不能扩容和删除的缺陷,有没有可以替代的数据结构呢?【后端八股文二:布隆过滤器八股文合集】_布隆过滤器不能扩容-优快云博客

………

(算法篇)
大厂面试:算法考前必看汇总(全)_大厂面试算法题-优快云博客

MySQL的索引数据结构

索引是一种建立在特定列上的数据结构索引的原理是把无序的数据变为有序的查询

  • mysql索引的数据结构是树,常用的存储引擎innodb采用的是B+树
  • 非关系型数据库MongoDB使用B树作为数据库索引

B-Tree 是最常用的用于索引的数据结构。因为它们是时间复杂度低, 查找、删除、插入操作都可以可以在对数时间内完成。另外一个重要原因存储在B-Tree中的数据是有序的。

索引

  • 索引是存储引擎用于提高数据库表的访问速度的一种数据结构

优点:

  • 为了提高数据的查询效率
  • 加快分组和排序的速度(为排序或者分组的字段加索引)
  • 加快表与表之间的连接

缺点

  • 建立索引需要占用物理空间
  • 会降低表的增删改效率,因为每次增删改,需要动态维护索引,导致增删改时间变长

建立原则

  • 最频繁使用的、用以缩小查询范围的字段
  • 频繁使用的、需要排序的字段

不适合

  • where中用不到的字段
  • 表记录较少
  • 需要经常增删改
  • 参与列计算的列
  • 区分度不高的,比如性别男女

(索引检索靠磁盘IO操作,好的索引减少磁盘IO操作次数)
一般来说,索引本身也很大,不可能全部存储在内存中,
一般以文件形式存储在磁盘上,索引检索需要磁盘I/O操作。
判断一种数据结构作为索引的优劣主要是看在查询过程中的磁盘IO渐进复杂度,一个好的索引应该是尽量减少磁盘IO操作次数

索引优化的方法

(1)like语句的前导模糊查询不能使用索引
(2)负向条件查询不能使用索引,有时候考虑优化成in
(3)联合索引最左前缀原则,区分度最高的字段在最左边
(4)不要在索引列上面做任何操作(计算、函数),否则会导致索引失效而转向全表扫描
(5)索引不会包含有NULL值的列,
复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时,尽量使用not null 约束以及默认值。
(6)如果有order by、group by的场景,请注意利用索引的有序性
例如对于语句 where a=? and b=? order by c,可以建立联合索引(a,b,c)
(7)使用短索引
根据实际文本区分度决定索引长度即可
(8)如果明确知道只有一条结果返回,limit 1 能够提高效率

select * from user where login_name=? limit 1

自己明确知道只有一条结果,但数据库并不知道,明确告诉它,让它主动停止游标移动。
(9)超过三个表最好不要 join

  • 需要 join 的字段,数据类型必须一致,多表关联查询时,保证被关联的字段需要有索引。
  • 例如:left join是由左边决定的,左边的数据一定都有,所以右边是我们的关键点,建立索引要建右边的。当然如果索引在左边,可以用right join

深层原因

1. 使用聚合函数

使用了聚合函数后,不再是索引的递增顺序了,因此不能使用索引

优化器的偷懒行为

对于select * from tradelog where id + 1 = 10000这个SQL语句,这个加1操作并不会改变有序性,但是MySQL优化器还是不能用id索引快速定位到9999这一行。所以,需要

评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值