几道MySQL索引相关的重点面试题
MySQL 索引你真的懂吗?这几道题带你了解索引的几个重要知识点
1. 什么是最左前缀原则?
以下回答全部是基于MySQL的InnoDB引擎
例如对于下面这一张表
如果我们按照 name 字段来建立索引的话,采用B+树的结构,大概的索引结构如下
如果我们要进行模糊查找,查找name 以“张"开头的所有人的ID,即 sql 语句为
select ID from table where name like '张%'
复制代码
由于在B+树结构的索引中,索引项是按照索引定义里面出现的字段顺序排序的,索引在查找的时候,可以快速定位到 ID 为 100的张一,然后直接向右遍历所有张开头的人,直到条件不满足为止。
也就是说,我们找到第一个满足条件的人之后,直接向右遍历就可以了,由于索引是有序的,所有满足条件的人都会聚集在一起。
而这种定位到最左边,然后向右遍历寻找,就是我们所说的最左前缀原则。
2. 为什么用 B+ 树做索引而不用哈希表做索引?
1、哈希表是把索引字段映射成对应的哈希码然后再存放在对应的位置,这样的话,如果我们要进行模糊查找的话,显然哈希表这种结构是不支持的,只能遍历这个表。而B+树则可以通过最左前缀原则快速找到对应的数据。
2、如果我们要进行范围查找,例如查找ID为100 ~ 400的人,哈希表同样不支持,只能遍历全表。
3、索引字段通过哈希映射成哈希码,如果很多字段都刚好映射到相同值的哈希码的话,那么形成的索引结构将会是一条很长的链表,这样的话,查找的时间就会大大增加。
3. 主键索引和非主键索引有什么区别?
例如对于下面这个表(其实就是上面的表中增加了一个k字段),且ID是主键。
主键索引和非主键索引的示意图如下:
其中R代表一整行的值。
从图中不难看出,主键索引和非主键索引的区别是:非主键索引的叶子节点存放的是主键的值,而主键索引的叶子节点存放的是整行数据,其中非主键索引也被称为二级索引,而主键索引也被称为聚簇索引。
根据这两种结构我们来进行下查询,看看他们在查询上有什么区别。
1、如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树。
2、如果查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,得到ID=100,再到ID索引树搜索一次,这个过程也被称为回表。
现在,知道他们的区别了吧?
4. 为什么建议使用主键自增的索引?
对于这颗主键索引的树
如果我们插入 ID = 650 的一行数据,那么直接在最右边插入就可以了
但是如果插入的是 ID = 350 的一行数据,由于 B+ 树是有序的,那么需要将下面的叶子节点进行移动,腾出位置来插入 ID = 350 的数据,这样就会比较消耗时间,如果刚好 R4 所在的数据页已经满了,需要进行页分裂操作,这样会更加糟糕。
但是,如果我们的主键是自增的,每次插入的 ID 都会比前面的大,那么我们每次只需要在后面插入就行, 不需要移动位置、分裂等操作,这样可以提高性能。也就是为什么建议使用主键自增的索引。
如果你觉得文章不错, 不妨: 1、点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
2、关注我,让我们成为长期关系
3、关注公众号「苦逼的码农」,里面已有100多篇原创文章,我也分享了很多视频、书籍的资源,以及开发工具,欢迎各位的关注,第一时间阅读我的文章。
几道MySQL索引相关的重点面试题相关推荐
- 一文整理14道MySQL索引相关面试题
精心整理14道MySQL索引相关面试题(珍藏版) 如果仅仅是死记硬背MySQL索引相关面试题一定是相当枯燥的,不容易记却容易忘,这里循序渐进的讲解有关索引有关知识点,让大家在理解的基础上记住一些面试常 ...
- Mysql数据库(四)——mysql索引相关知识
Mysql数据库(四)--mysql索引相关知识 一.索引的概念 二.索引的优缺点 1.优点 2.缺点 三.创建索引的原则 四.索引的分类和创建方法 1.普通索引 ①.直接创建索引 ②.修改表方式创建 ...
- MySQL索引相关知识整理学习
MySQL索引相关知识整理学习 前言 一.MySQL索引 哈希索引 B+树索引 B+树的优点 聚簇索引 非聚簇索引 聚簇索引和非聚簇索引的特点及区别: 二.特殊类型的索引 1.覆盖索引 2.联合索引 ...
- MYSQL 索引相关
为什么需要索引(Why is it needed)? 当数据保存在磁盘类存储介质上时,它是作为数据块存放.这些数据块是被当作一个整体来访问的,这样可以保证操作的原子性(原子性是指一个完整的事务程序,要 ...
- MySQL索引相关的数据结构和算法
索引相关的数据结构和算法 通常我们所说的索引是指B-Tree索引,它是目前关系型数据库中查找数据最为常用和有效的索引,大多数存储引擎都支持这种索引.使用B-Tree这个术语,是因为MySQL在CREA ...
- Mysql索引、命令重点介绍
目录 Mysql 索引整理 1.索引概念介绍: 2.索引基本操作 3.索引的底层原理 4.聚簇索引.非聚簇索引 5.什么情况下无法利用索引 附录: 常用sql crud相关sql 关键字顺序 1.使用 ...
- MySQL索引相关知识
MySQl索引创建 一.什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直 ...
- 了解mysql文章_一篇文章带你深入了解MySQL 索引相关
基础知识 一张数据表中具有百万级的数据时,如何精确且快速的拿出其中某一条或多条记录成为了人们思考的问题. InnoDB 存储引擎的出现让这个问题得到了很好的解决, InnoDB 存储引擎是以索引来进行 ...
- MySQL 索引相关知识
今天又手贱,路边走的时候顺手拽一片叶子下来.不得不说,不知是那叶子漂亮,还是单身久了看片叶子都眉清目秀的.就把它夹在了书里,做个标本.等我第二天去观察标本好了没,哦,找不到了,我就一张一张的翻过书页, ...
最新文章
- 用NumPy genfromtxt导入数据
- xhprof 安装使用(windows linux混版)
- Apache 的管理及优化web
- 采用Opserver来监控你的ASP.NET项目系列(二、监控SQL Server与Asp.Net项目)
- 利用jenkins的api来完成相关工作流程的自动化
- 数据结构(Java)——查找和排序(1)
- 修改Chrome默认搜索引擎为Google.com
- 百度编辑器复制微信图片无法保存
- Web前端的学习路线到底是什么,看完秒懂!
- Oracle 11gR2 中 示例用户 安装说明
- Java面试题--shiro
- Arduino 连接JDY-08蓝牙模块
- 如何成为微信小程序的开发者?
- ipad pro能用python编程吗_涨知识!iPad还可以运行Python代码
- CentOS7常用工具包安装
- 直播平台源码开发关于发送短信验证码设置
- java tld tag_自定义标签tag(jsp编写)和tld(java编写)的使用方法
- 【BFS】lydsy3161 孤舟蓑笠翁
- CentOS ping本机ip,能ping通,外网ping不通
- HTML5自动换行的间距设置,设置EXCEL自动换行的行与行之间的间距的办法