MySQL--索引常见面试题详解

索引的设计原则?

  • 在 where 子句中出现的列,建议设计索引。
  • 基数较小的列,不建议设计索引。
  • 尽量只用短索引,可以节省索引空间。
  • 不要过度索引,多设计联合索引,因为索引也有时间和空间的消耗。

创建索引需要注意什么?

  • 建立索引的字段不要为空,除非说一定要存储 NULL,否则都设置一个默认值。
  • 索引的字段长度越小越好,减少空间占用,因为数据库的数据存储是以页为单位的,叶的大小是固定的,字段长度短,一页可以存储的数据就多,一次IO就可以获取更多的数据。

创建索引的原则?

  • 能创建联合索引,就不要使用单列索引。
  • 最左前缀原则,要充分结合查询条件去设计联合索引。
  • 查询频繁的字段去建立索引,更新频繁的字段要谨慎建索引。
  • 辨识度低、重复度够的字段不要建立索引,如性别等。
  • 尽量去扩展原有的索引,避免新建索引。
  • 定义为外键的列一定要建立索引。
  • 不要对 text、image 这种数据类型建立索引。

什么是前缀索引?

前缀索引就是取某个列的前几个字符建立索引,语法如下:

#给 user 表 hobby 字段建立前缀为 prefix_length 的 index_hobby 索引
ALTER TABLE table ADD index  index_hobby(hobby(prefix_length));

前缀索引的难点在于截取前缀的长度,我们可以通过一下语法来获取合适的长度:

#先计算 hobby 全列的区分度
SELECT COUNT(DISTINCT hobby) / COUNT(*) FROM user;
#再计算 hobby 前缀的区分度,计算出区分度和全列最相近那个值,就是我们想要的值。
SELECT COUNT(DISTINCT LEFT(hobby, 5)) / COUNT(*) FROM user;

为什么要使用前缀索引?

如果当某个字段很长,而且查询又很频繁,如果使用全字段索引的话,就会很占空间,这个时候就可以使用前缀索引,有效的缩小了索引文件的大小,可以让一页存放更多的索引,从而提高了查询速度。

什么是最左前缀原则?

  • 顾名思义,就是最左侧优先原则,适用于联合索引,在创建联合索引的时候要特别注意,要根据业务查询条件,去合理设计联合索引的字段顺序。
  • 最左匹配原则,遇到范围查询,则自动停止,但是可以乱序,比如 where a=1 and b=2 and c=3,可以写成 where a=1 and c=3 and b=2 。
  • 最左匹配原则,遇到跳跃则自动停止,例如 where a=1 and c=3,这种情况索引就只能用到字段 a。

B-Tree 和 B+Tree 的区别?

  • B-Tree 中每个节点,都存放了 key 和 data,B+Tree 非叶子节点只存储key,叶子节点同时存放 key 和 data。
  • B+Tree 的叶子节点有指针连接,而 B-Tree 则没有,B-Tree各个节点独立。
  • B-Tree 中每个节点,都存放了 key 和 data,把访问频繁的数据放在根节点附近,就会大大提高查询效率。
  • B+Tree 叶子节点包含所有data,叶子节点从左到到右是保持顺序的,且相互之间有指针,这样可以很好的提高增删效率。

MySQL为什么使用B+Tree 做索引数据结构而不用B-Tree?

  • B-Tree 只适合随机查询,而B+Tree 同时支持随机查询和顺序查询。
  • B+Tree 空间利用率更高,可以减少IO次数,磁盘的读写代价的叶子节点有指针连接,而 B-Tree 则没有,B-Tree各个节点独立。
  • B-Tree 中每个节点,都存放了 key 和 data,把访问频繁的数据放在根节点附近,就会大大提高查询效率。
  • B+Tree 非叶子节点只存储key,因此一页数据可以存放更多的 key,一次查询就可以获取更多的key,可以快速的缩小查找范围。
  • B+Tree 叶子节点有指针,可以更高效的进行范围查询。

Hash 和 B+Tree 的区别?

  • Hash 索引在等值查询的时候速度一般优于 B+Tree索引。
  • Hash 索引不支持排序,不支持范围查询,而 B+Tree索引都可以支持。
  • Hash 索引不支持模糊查询及联合索引的最左前缀法则,而 B+Tree索引都可以支持。
  • Hash 索引如果碰到哈希碰撞的时候会出现性能不稳定的情况。
  • B+Tree 叶子节点有指针,可以更高效的进行范围查询。

非聚集索引一定会回表查询吗?

不一定,如果查询返回的字段全部命中了索引,也就是覆盖索引,这个时候就无需回表查询。

什么是索引下推?

索引下推:Index Condition Pushdown,简称ICP,通过把索引过滤条件下推到存储引擎,来减少 MySQL 存储引擎访问基表的次数和 MySQL 服务层访问存储引擎的次数,而在传统的查询过程中,MySQL会先使用索引定位到符合条件的数据记录,然后根据过滤条件进行数据过滤,这种方式比较低效,因为它需要读取很多不符合条件的数据记录,而索引下推的原理是,在使用索引定位到复合记录的条件时候,将过滤条件下推到存储引擎级进行处理,存储引擎可以利用索引的顺序性和范围性,直接在索引上过滤,减少不必要的数据读取,这样可以大大提高查询效率。

持续更新ing。。。

如有不正确的地方请各位指出纠正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【css面试题】弹性盒布局模型 flex 全部知识点整理

一、基本语法 flex-basis 在分配多余空间之前,占据的主轴空间,相当于 widthflex-grow 定义项目的放大比例(存在剩余空间是否放大)默认为0 (即如果存在剩余空间也不放大)flex-shrink 定义项目的缩小比例(空间不足&…

Mysql隔离级别的实现

Mysql隔离级别的实现 mysql隔离级别是通过MVCC锁来实现的,MVCC用来实现读已提交、可重复读 Mysql幻读的解决 1.针对快照读,通过 MVCC 方式解决了幻读 补充:串行化所有的数据库都没做,不过mvcc实现的效果跟串行化差不太多了,可以…

突飞猛进,智能饮品机器人如何助力实体经济?

近日,财务部公布了2024年第一季度及全年财报。数据显示,连锁品牌增长速度惊人,这其中不得不提到智能饮品机器人的使用,为不同的品牌门店拼速度、抢点位立下了不小的功劳,那么智能饮品机器人到底如何助力各门店&#xf…

Outlook API发送邮件的方法?如何设置接口?

如何使用Outlook API发送电子邮件?怎么调用API接口? 为了满足更高级别的需求,我们可能需要通过编程的方式来操作Outlook,这时候,Outlook API就显得尤为重要了。那么,如何使用Outlook API发送邮件呢&#x…

Spring Security自定义认证授权过滤器

自定义认证授权过滤器 自定义认证授权过滤器1、SpringSecurity内置认证流程2、自定义Security认证过滤器2.1 自定义认证过滤器2.2 定义获取用户详情服务bean2.3 定义SecurityConfig类2.4 自定义认证流程测试 3、 基于JWT实现无状态认证3.1 认证成功响应JWT实现3.2 SpringSecuri…

OceanBase中binlog service 功能的试用

OBLogProxy简介 OBLogProxy即OceanBase的增量日志代理服务,它可与OceanBase建立连接并读取增量日志,从而为下游服务提供了变更数据捕获(CDC)的功能。 关于OBLogProxy的详尽介绍与具体的安装指引,您可以参考这篇官方OB…

基于R语言的水文、水环境模型优化技术及快速率定方法与多模型教程

原文链接:基于R语言的水文、水环境模型优化技术及快速率定方法与多模型教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597847&idx7&snd71869f1290d0ef9dd7fd3f74dd7ca33&chksmfa823ef0cdf5b7e655af5e773a3d3a1b200632a5981f99fe72f0…

普林斯顿算法讲义(一)

原文:普林斯顿大学算法课程 译者:飞龙 协议:CC BY-NC-SA 4.0 1. 基础知识 原文:algs4.cs.princeton.edu/10fundamentals 译者:飞龙 协议:CC BY-NC-SA 4.0 概述。 本书的目标是研究各种重要和有用的算法——…

多线程编程

多线程写作类 倒计时协调器CountDownLatch 某个线程需要等待其他线程执行到特定操作结束即可。例如:在多Web服务中,在启动指定服务时需要启动若干启动过程中比较耗时的服务,为了尽可能减少服务启动过程的总耗时,该服务会使用专门…

深入探讨MES管理系统与MOM系统之间的关系

在制造业的信息化浪潮中,各种系统与技术层出不穷,其中MES制造执行系统和MOM制造运营管理无疑是备受瞩目的两大主角。尽管它们都是制造业信息化不可或缺的部分,但许多人对它们之间的区别与联系仍感到困惑。本文将对MES管理系统和MOM系统进行深…

uniapp小程序上传oss

uniapp上传小程序代码 import crypto from crypto-js; import { Base64 } from js-base64/base64.js; // 计算oss签名。 function computeSignature(accessKeySecret, canonicalString) {return crypto.enc.Base64.stringify(crypto.HmacSHA1(canonicalString, accessKeySecre…

#数据结构 线性表的顺序存储

目录 每日文案 一、线性表的定义 二、线性表的操作 顺序表的存储结构 顺序表的初始化操作 判断顺序表是否为空表 将顺序表置为空表 计算顺序表中的元素个数 取出顺序表中的对应位置元素 取出对应数值的位序 在对应位置插入元素 将对应位置的元素删除 将顺序表中的数据…

1.Python数据分析—数据分析与挖掘详讲

1.Python数据分析—数据分析与挖掘详讲 一个人简介二数据分析与挖掘概述三什么是数据分析和挖掘四数据分析与挖掘在不同领域的应用4.1医疗领域:4.1.1 建立疾病数据库:4.1.2 临床决策支持:4.1.3 疾病预警和监控: 4.2 电子商务领域&…

Linux下platform驱动框架编写

一. 简介 前面一篇文章简单学习了 Linux内核中platform驱动代码。文章地址如下: Linux下platform驱动简介-CSDN博客 本文学习编写 platform驱动框架代码。 二. Linux下platform驱动框架编写 1. 编写platform驱动代码的思路 (1) 定义结…

第12章 指针

以下内容是学习尚硅谷 12.1 指针基本介绍 1)指针是C语言的精华,也是C语言的难点 2)指针,也就是内存的地址;所谓指针变量,也就是保存了内存地址的变量。关于指针的基本使用,在讲变量的时候做了…

WAPI模块AT指令驱动

一、前言 由于项目更迭,需要将原4G模块更换为国内的WAPI协议模块,主控芯片NRF52840无需改动其他部分,只需要将串口部分的数据格式稍作更改即可。 编程风格和之前的esp8266一致,同样都是AT指令来配置模块,由于主…

Java封装的优点

目录 提高代码可维护性 降低耦合度 保护数据安全性 封装如何提高安全性 数据隐藏 访问控制 限制接口 错误隔离

请解释Redis是什么?它有哪些主要应用场景?Redis支持哪些数据类型?并描述每种数据类型的特性和使用场景。

请解释Redis是什么?它有哪些主要应用场景? Redis是一款内存高速缓存NoSQL数据库,使用C语言编写,它支持丰富的数据类型,如String、list、set、zset、hash等,并且这些数据类型都直接支持数据的原子性操作&…

d2-crud-plus 使用小技巧(四)—— 搜索限制只能输入数字

需求 搜索时有些字段需要限制,比如只能输入数字,不能存在其他字符包括空格。 效果 事情焦点后先触发校验,在触发查询。 代码 crud.js export const crudOptions (vm) > {return {columns: [{title: 号码,key: number,search: { //…

比Let‘s Encrypt更简单更齐全的免费证书申请教程

步骤一 打开JoySSL官网,注册属于你的专属账号; 永久免费SSL证书申请地址真正完全且永久免费!不用您花一分钱,SSL证书免费使用90天,并且还支持连续签发。JoySSL携手全球权威可信顶级根,自研新一代SSL证书&…