面试系列——Mysql索引
1、索引分类
- Hash索引
Hash 索引查询效率很高,时间复杂度O(1)。Mysql Innodb引擎不支持hash索引的。Hash索引适合精确查找,不适合范围查找。 - 平衡二叉树
时间复杂度为 O(n),根节点会变,数据量多,层次多,磁盘IO多。 - B树
每个节点中不仅包含数据的 key 值,还有 data 值。数据量较大的时候,同样会导致B树很深,从而增加了磁盘 IO 的次数。 - B+树
所有的数据节点都在最后一层上,叶子节点按关键字排序,从左到右指针连接,层级更少,查询稳定。
2、主键索引
搜索过程:索引页 ——> 索引页 ——> 数据页

索引页+数据页组成的B+树就是聚簇索引。
InnoDB聚簇索引:
- 如果定义了PK,那么PK就是聚簇索引。
- 没有PK,第一个not null unique就是聚簇索引。
- 否则,自动建一个隐藏列作为聚簇索引。
聚簇索引叶子节点储存整行数据(就是数据页);
普通索引叶子节点:
- InnoDB储存主键索引;
- MyIsam储存行记录的指针;
3、回表与索引覆盖
非聚簇索引(普通索引)中只保存了索引字段的值(按照顺序排列,联合索引先按第一列排序,再按第二列……排序,全都相同,再按主键索引排序)与主键索引的值。
回表:
Select的where条件中是非聚簇索引,查询需要返回非聚簇索引中不包含的字段,此时需要用主键索引再查一次表;
索引覆盖:
将被查询的字段,建立到联合索引里去。
4、联合索引与最左匹配
- 多列条件为OR关联时,不生效;
- 最左匹配,最左边的列必须在查询条件中,不然不生效;
- 联合索引范围查询时,第一列是范围查询,后续的列再范围查询是没法走索引的,只有第一列是等值查询时,后续的列才能用范围查询。
- groupBy+索引,效率特别高,不需要建中间表,也不需要排序;
5、索引优化
- 大字段建索引时,可以只取字段的前半部分;
CREATE INDEX table ON dual(address(20)); - 某个值在某一列中出现比列很高时,查询优化器就会放弃索引,全表扫;比例分界线默认是30%;
- orderBy和groupBy后的字段最好建索引,不会产生中间表;
- 隐式类型(“1”=> 1)转换会导致索引失效;
- 大数据查询分页使用Limit时,先嵌套子查询,把id查出来,再通过id用where条件搜索,可以走索引,避免回表;
面试系列——Mysql索引的更多相关文章
- php面试专题---Mysql索引类型、介绍及优点
php面试专题---Mysql索引类型.介绍及优点 一.总结 一句话总结: 精品视频讲解里面的资料来源也是通过各种资料,比如博客.书等,只不过是基于讲解者的知识体系有整理的过程 1.B-Tree索引三 ...
- php面试专题---Mysql索引原理及SQL优化
php面试专题---Mysql索引原理及SQL优化 一.总结 一句话总结: 注意:只写精品 1.为表设置索引要付出代价 是什么? 存储空间:一是增加了数据库的存储空间 修改插入变动索引时间:二是在插入 ...
- .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引
系列文章索引: .NET面试题解析(01)-值类型与引用类型 .NET面试题解析(02)-拆箱与装箱 .NET面试题解析(03)-string与字符操作 .NET面试题解析(04)-类型.方法与继承 ...
- 阿里面试:MySQL如何设计索引更高效?
有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...
- 我以为我对Mysql索引很了解,直到我遇到了阿里的面试官
GitHub 4.8k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 4.8k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 4.8k Star 的 ...
- Mysql高手系列 - 第22篇:深入理解mysql索引原理,连载中
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第22篇. 背景 使用mys ...
- 深入浅出Mysql索引优化专题分享|面试怪圈
文章纲要 该文章结合18张手绘图例,21个SQL经典案例.近10000字,将Mysql索引优化经验予以总结,你可以根据纲要来决定是否继续阅读,完成这篇文章大概需要25-30分钟,相信你的坚持是不负时光 ...
- 数据库系列:MySQL索引优化总结(综合版)
1 背景 作为一个常年在一线带组的Owner以及老面试官,我们面试的目标基本都是一线的开发人员.从服务端这个技术栈出发,问题的范围主要还是围绕开发语言(Java.Go)等核心知识点.数据库技术.缓存技 ...
- 面试突击60:什么情况会导致 MySQL 索引失效?
为了验证 MySQL 中哪些情况下会导致索引失效,我们可以借助 explain 执行计划来分析索引失效的具体场景. explain 使用如下,只需要在查询的 SQL 前面添加上 explain 关键字 ...
随机推荐
- 搭建LAMP环境部署GLPI资源管理系统
搭建LAMP环境部署GLPI资源管理系统 一.关闭防火墙和Selinux [root@localhost ~]# systemctl disable --now firewalld [root@loc ...
- linux rpm包解压
rpm2cpio xxx.rpm | cpio -div
- 云计算OpenStack共享组件---Memcache缓存系统(3)
一.缓存系统 1.静态web页面: (1)在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request), ...
- mysql基础之mariadb概念
一.数据库介绍 什么是数据库(Database)? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库 ...
- SpringMVC Jackson 库解析 json 串属性名大小写自动转换问题
问题描述 在项目开发中,当实体类和表中定义的某个字段为 RMBPrice,首字母是大写的,sql 查询出来的列名也是大写的 RMBPrice,但是使用 jquery 的 ajax 返回请求响应时却出错 ...
- AJAX 原理与使用
AJAX 是什么 AJAX ( Asynchronous JavaScript and XML,异步 JavaScript 和 XML,中文读音:"阿贾克斯 ") 是一种 Web ...
- Jlink固件更新
故障:JLINK上的指示灯也不亮,无驱动等 文中所提工具和固件链接: 工具:http://pan.baidu.com/s/1c2z8nao 固件:http://pan.baidu.com/s/1jIB ...
- RabbitMQ 集群原理
RabbitMQ默认集群原理 rabbitmq 本身是基于erlang编写,erlang语言天生具备分布式的特性(通过同步Erlang集群各节点的erlang cookie实现),RabbiteMQ天 ...
- .Net Core gRPC 实战(二)
概述 gRPC 客户端必须使用与服务相同的连接级别安全性. 如调用服务时通道和服务的连接级别安全性不一致,gRPC 客户端就会抛出错误. gRPC 配置使用HTTP gRPC 客户端传输层安全性 ( ...
- Unity3d无法导入TensorFlowSharp plugin包问题
环境: unity3d:2018.3.0.f2 版本 解决方法: TensorFlowSharp 仍然属于测试版本. 因此,需要将Unity3d 转到测试版本. (1)点击 File > Bui ...