首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
我叫呀哈哈
武汉大学 Java
关注
已关注
取消关注
#牛客网博客#
@我叫呀哈哈:
从Mysql不走索引看InnoDB的索引原理
有索引的情况下,Mysql还是扫表,怎么回事 这两天碰到一个这个问题:在where语句中有一个字段可以走二级索引去范围查的情况下,发现mysql并没有走索引,而是扫表。不知道大家有没有遇到过这个问题。 为什么mysql在明明有索引的情况下却选择不走索引,而选择扫表呢?今天我们从InnoDB的索引原理讲一下为什么会出现这种现象。 InnoDB索引原理 InnoDB对于PK的索引策略和二级索引的策略是不一样的。 部分知识来自于《高性能MySQL》,以及我自己的理解,本人没有看过源码,所以大家对内容要自行甄别对错,自己思考,不要以我为准 数据结构 InnoDB的索引数据结构是B树,更准确的说是B+树。为什么是B+树呢?因为B+树非叶子节点不带数据,所以存储索引数据可以使用更少的磁盘存储空间,那么在PageCache读盘的时候,预读可以一次读取更多的索引数据,从而使用更少的磁盘IO就可以查询到更多的索引数据,这样就可以更快的定位到数据位置。 聚集索引 一张表只能有唯一的聚集索引。一般PK上的索引会自动被设置为聚集索引(但是你也可以先创建聚集索引,再创建PK,大多数情况下,PK索引就是聚集索引)。之所以叫聚集索引,是因为所有叶子节点上的记录都紧凑的按主键顺序存储在磁盘上。由于这个特点,使用主键自增会获得很好的写性能,因为是顺序写。 非聚集索引 二级索引和PK索引不一样,虽然数据结构也是B+树,但是叶子节点上的数据记录的是PK的值,而不是实际的数据,所以在使用二级索引查找到的实际是二级索引对应的PK索引。 这样会导致一个问题,就是对于二级索引上的范围查找,会导致大量的随机读IO。因为首先根据二级索引查找到的是一批离散的PK,然后再根据这些PK去查找记录,这时候会发生随机读IO,并且还带来了logn的额外查询时间。 覆盖索引 上面说到二级索引范围查找带来的随机IO现象,再有一种情况下不会发生,那就是SELECT的字段只有PK和二级索引的列,由于二级索引的叶子节点上保存的就是PK数据,并且二级索引中就保存了列的值,所以这时候不需要再回到PK索引上查找。 所以,如果我们SELECT中的列都有对应的索引存在的话,那么会提升查找效率,因为不需要去真正的记录里面去查找数据,只用在索引数据里面查找就行了。 这种索引称为覆盖索引。 回答问题 好了,对索引原理有一个大致的了解。 那么为什么有时候,where语句里面明明有索引可走的情况下,mysql会选择扫表呢?原因就是扫表是顺序IO,而二级索引是先查找PK,然后再在PK索引中查找,是一个随机IO,外带一个logn的查询开销。 那么当二级索引范围查的扫描列大于一定的数量的时候,explain会发现,prossible_keys显示有索引可走,但是实际的key却没有走索引,type=ALL。 当逐渐缩小二级索引上的查找范围的时候,会发现,mysql会突然又选择去使用prossible_keys下显示的索引了。 举个例子 举个例子: CREATE TABLE `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `type` int(11) DEFAULT '0', `status` int(11) DEFAULT '0', `created_at` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_create_at` (`created_at`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; created_at列上有一个二级索引。 使用查询语句: SELECT count(*) FROM test WHERE type=? and status=? and created_at>'2020-01-01 00:00:00'; 这时explain: select_type type prossible_keys key Extra SIMPLE ALL idx_create_at NULL Using where 可以看到有索引却没有走。 当我们缩小created_at的范围时: SELECT count(*) FROM test WHERE type=? and status=? and created_at>'2020-03-01 00:00:00'; 这时explain: select_type type prossible_keys key Extra SIMPLE range idx_create_at idx_create_at Using index condition; Using where 发现同样一个语句,在范围查不同的情况下,有时候Mysql会选择不同的方式去进行实际的查找。 刚刚说过了,这种权衡是在较少的随机IO和较多的顺序IO这两者之间抉择的,并不是没有走索引性能就一定会差。 这里count(*)可以换成表中各个具体的列,但是不要用select *,这样不会走索引,原因我还不知道 让mysql强制走索引 也很简单,查询分两步走: SELECT count(*)FROM test as a inner join test as b on a.id=b.id and a.status=? AND a.type=? AND b.created_at>"2020-01-01 00:00:00"; 再次expain: select_type table type prossible_keys key Extra SIMPLE b range PRIMARY,idx_create_at idx_create_at Using where; Using index SIMPLE a eq_ref PRIMARY PRIMARY Using where 发现两次查询都走了索引。 并且使用idx_create_at二级索引的时候,还是用了覆盖索引,因为这一步只取出了PK。 我的个人博客:https://www.jelliclecat.cn/新出炉的RPC框架(如果这篇文章对你有用记得帮我点个star~):https://github.com/zhengrenjie/catty
点赞 1
评论 0
牛客网博客
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
05-31 01:09
已编辑
学而思_HR(准入职员工)
6月份还能找得到暑期吗?有0offer的牛油吗?
6月份还能找得到暑期吗?有0offer的牛油吗?即将截止的暑期1.蚂蚁5.31截止内推链接(即内推):https://u.alipay.cn/_6u8FDXOjtuLHvNq4i6YdZV2.得物即将截止(末班车)内推码:【ARUNW33】(选择校园大使推荐)内推链接:https://poizon.jobs.feishu.cn/s/i55A1W5V3.外企曼伦末班车【内推链接】https://app.mokahr.com/m/campus_apply/manon/142742?recommendCode=DSMmWZyC&hash=%23%2Fjobs#/jobs内推码DSMmWZyC...
点赞
评论
收藏
分享
05-31 16:41
门头沟学院 Java
大模型面经(第一期)
因为又被运营约稿了,然后也老被催更新,所以趁着放假就更新一下,这篇就写怎么去面试,怎么去准备大模型吧,这里也很有意思,这个牛客网在boss上来要我简历了,后面加了微信不过他们只要2-4年的资深大模型工程师。那么直接开始吧,本来打算早点更新的,不过嘛,下班之后一直在打游戏,对此只能说三角洲太好玩了,琳琅天上还是当年模样,好玩,想起小学时代玩的qq飞车了(时代眼泪了算是,现在人估计都没听过这个游戏了何况会去玩呢,真怀念那会边听歌边跑图)一晃便过去一个时代,这时间若白驹过隙,所以啊,诸君当是要珍惜时间和家人,不要太看重工作。先随便讲点吸引大伙注意力,那么直接开始今天的教程。先叠甲:以下的问题,基本上...
查看23道真题和解析
牛客激励计划
牛友故事会
点赞
评论
收藏
分享
04-22 10:11
西北农林科技大学 风电运维工程师
求助🆘大二第一次投实习
请问这算是没戏了么?
被加薪的哈里很优秀:
应该继续招人,不会给你留岗位的
点赞
评论
收藏
分享
04-06 11:24
已编辑
太原学院 C++
我嘞个豆啊我还以为是鼠鼠被某司hr一眼看中了😅
真烦好烦真烦:
感觉不太对劲,这种主动加微信的一般都是坑,要小心辨别
点赞
评论
收藏
分享
05-31 22:47
门头沟学院 嵌入式软件工程师
诺瓦星云一面
一面 32min1、自我介绍、实习2、SPI和QSPI的区别。3、问我那个死单片机项目,I2C软件模拟的还是硬件的。引脚什么的怎么配置的。。4、Makefile写过吗,说一下结构,依赖之类的。5、硬件调试什么的工具会不会。6、IPC方法7、自旋锁和信号量说一下。8、有没有用过锁,为什么用9、死锁有没有遇到过10、C++多态原理11、STL用过哪些,为什么用。为什么用vector不用数组。12、讲STL底层13、电机驱动有没有用过(没有)14、反问技术栈,夸夸说了五分钟,反问应届生培养。更多内容全在下方专栏全网最受欢迎的嵌入式笔试专栏笔试专栏包含全部最新的笔试必考考点,非常适合在找工作面经薄弱的...
查看14道真题和解析
面试经验谈
嵌入式笔面经分享
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
招聘动态
查看更多
奇安信—菁英计划(26届)
网安一哥可转正实习专场招聘
华泰Fintech星战营
全站热榜
更多
1
...
你的经历比较单薄, 但简历又弥补了这一点--双非仔个人简历分享
2947
2
...
六月还有机会的,对吗?
2237
3
...
字节last day,知无不言!
2203
4
...
发现27282届的同学怎么越来越卷了,投个票看看相互的进度吧
1942
5
...
只有收到offer那一刻是开心的
1200
6
...
25 暑期实习&秋招面经
1087
7
...
怎么包装实习经历呢
1047
8
...
记录一下选择
997
9
...
为什么我的mos管驱动电路总是不听话?(上-基本原理总结)
887
10
...
答辩时被导师当着所有人的面阴阳
863
创作者周榜
更多
正在热议
更多
#
写给毕业5年后的自己
#
7094次浏览
123人参与
#
今年形式下双非本找得到工作吗
#
134031次浏览
1008人参与
#
华泰证券Fintech星战营
#
190857次浏览
279人参与
#
职场捅娄子大赛
#
334807次浏览
3374人参与
#
你的秋招第一场笔试是哪家
#
128628次浏览
1399人参与
#
一人一个landing小技巧
#
65202次浏览
1009人参与
#
材料专业就业可以去哪些企业岗位
#
32862次浏览
314人参与
#
汇川技术求职进展汇总
#
120905次浏览
809人参与
#
产品2023笔面经
#
51208次浏览
441人参与
#
哪些公司笔/面试难度大?
#
2608次浏览
19人参与
#
硬件应届生薪资是否普遍偏低?
#
70266次浏览
506人参与
#
我想象的工作vs实际工作
#
470954次浏览
4781人参与
#
今年的你投递了多少份简历才上岸
#
33582次浏览
117人参与
#
通信硬件人社招/春招/实习投递现状
#
24976次浏览
922人参与
#
实习中的菜狗时刻
#
349858次浏览
3219人参与
#
考公VS就业,你怎么选?
#
58732次浏览
393人参与
#
总结:哪家公司面试体验感最差
#
55860次浏览
262人参与
#
工作后会跟朋友渐行渐远吗
#
25867次浏览
191人参与
#
机械人的薪资开到多少,才适合去?
#
107859次浏览
445人参与
#
你的论文盲审过了没?
#
103177次浏览
1468人参与
#
考公还是考研,你怎么选?
#
26068次浏览
131人参与
牛客网
牛客企业服务