mysql面试题 Day4

1 什么是覆盖索引?对 要查询的列和 查询条件中的列 有什么要求

覆盖索引(Covering Index)是指一个索引包含了一次查询所需的全部列,因此可以完全满足查询需求,而无需访问实际的表行数据。(即避免回表操作)。

覆盖索引的定义

覆盖索引是一个包含查询中的所有列(包括查询条件列、选择列和排序列)的索引。覆盖索引使得查询可以完全通过索引来执行,而不需要读取表的实际数据行。

覆盖索引的要求

  1. 查询条件列(WHERE 子句中的列):这些列可以帮助MySQL快速定位匹配的行。
  2. 选择列(SELECT 子句中的列):这些列是查询返回的列。
  3. 排序列(ORDER BY 子句中的列):如果查询包括排序,这些列应该包含在索引中,以利用索引进行排序。

举个例子

假设有一个表 students,包含以下字段:

  • id(主键)
  • name
  • age
  • grade

假设我们有以下查询:

SELECT name, age FROM students WHERE name LIKE '张%' AND age > 20;

为了使查询可以使用覆盖索引,我们需要创建一个包含 name 和 age 列的复合索引:

CREATE INDEX idx_name_age ON students (name, age);

覆盖索引的好处

  • 提高查询性能:由于所有查询需要的数据都在索引中,MySQL不需要回表查找,减少了I/O操作。
  • 减少数据页访问:访问索引通常比访问数据页更快,特别是在表较大的情况下。
  • 优化磁盘使用:使用覆盖索引可以减少磁盘读取操作,提高缓存命中率。

有了覆盖索引 idx_name_age 后,查询过程如下:

  1. 索引扫描:MySQL使用 idx_name_age 索引找到所有 name LIKE '张%' 的记录。
  2. 索引下推(ICP):在索引扫描过程中,直接在索引中检查 age > 20 的条件。
  3. 返回结果:由于 name 和 age 都包含在索引中,MySQL可以直接从索引返回结果,而不需要访问实际表数据。

总结

覆盖索引通过包含查询所需的所有列,显著提高了查询性能,尤其是对大表的查询。为了充分利用覆盖索引,建议在设计索引时,综合考虑查询条件列、选择列和排序列,并在一个索引中包含这些列。

2 索引有什么缺点?给全部字段都加上索引行不行?

  1. 空间占用:索引会占用额外的存储空间,特别是对于大型表来说,索引可能会占用大量的磁盘空间。

  2. 写操作性能下降:当对表进行插入、更新、删除等写操作时,索引也需要被更新,这可能会导致写操作的性能下降。

  3. 查询优化器的选择问题:当给表的所有字段都加上索引时,查询优化器可能会难以选择最优的索引,从而影响查询性能。

  4. 缓存失效率增加: MySQL会根据查询的使用频率和访问模式来决定哪些索引放入内存中。如果全部索引的总大小超过了可用内存,MySQL将无法完全缓存所有索引,导致更多的磁盘IO操作,从而降低查询性能。

  5. 内存压力增加: 当MySQL尝试将大量索引存储在内存中时,系统的内存压力会增加,可能影响到其他系统和进程的性能。

所以索引不是越多越好。⽐如为了避免数据量过⼤,某些时候我们会使⽤前缀索引。

使用前缀索引可以带来以下好处,特别是在面对大量数据时:

  1. 减少索引大小: 前缀索引只对索引列的前缀部分进行索引,而不是对整个列进行索引。这意味着索引的大小会减小,尤其是当索引列的值比较长的情况下,使用前缀索引可以大大减少索引占用的存储空间。

  2. 提高查询性能: 由于前缀索引减少了索引的大小,因此在进行查询时,MySQL需要读取的索引页数也会减少,这会提高查询的性能。特别是在涉及大量数据的查询场景下,前缀索引可以显著减少磁盘IO操作和内存消耗,从而加快查询速度。

  3. 降低索引维护成本: 由于前缀索引的大小较小,因此在进行索引维护操作(如插入、更新、删除)时,需要的时间和资源也会减少。这意味着使用前缀索引可以降低索引维护的成本,提高系统的整体性能和稳定性。

  4. 支持特定的查询模式: 在某些情况下,只需要对索引列的前几个字符进行匹配即可满足查询需求,这时使用前缀索引可以更好地支持这种查询模式。例如,对于字符串类型的列,可能只需要匹配前几个字符就能满足查询条件,这时使用前缀索引就能够更有效地支持这种查询。

总的来说,使用前缀索引可以在面对大量数据时带来存储空间的节省、查询性能的提升、索引维护成本的降低以及对特定查询模式的支持等好处。因此,在设计索引时,根据实际情况考虑是否可以使用前缀索引来优化数据库的性能。

3 mysql为什么使用B+树?

关键点:⾼度低,叶⼦节点是链表,查询时间可预测性,节点⼤⼩等于⻚⼤⼩

MySQL使⽤B+树主要就是考虑三个⻆度:

1. 和⼆叉树,如平衡⼆叉树,红⿊树⽐起来,B+树是多叉树,⽐如MySQL默认是1200叉树, 同样数据量,⾼度要⽐⼆叉树低;

2. 和B树⽐起来,B+树的叶⼦节点被连接起来,形成了⼀个链表,这意味着,当我们执⾏范围 查询的时候,MySQL可以利⽤这个特性,沿着叶⼦节点前进。⽽之所以NoSQL数据库会使 ⽤B树作为索引,也是因为它们不像关系型数据库那般⼤量查询都是范围查询;

3. B+树只在叶⼦节点存放数据,因此和B树⽐起来,查询时间稳定可预测。(注:这是⼀个⾼ 级观点,就是在⼯程实践中,我们可能倾向于追求⼀种稳定可预测,⽽不是某些数据贼快, 某些数据唰⼀下贼慢)

4. B+树和跳表⽐起来,MySQL将B+树节点⼤⼩设置为磁盘⻚⼤⼩,这样可以充分利⽤ MySQL的预加载机制,减少磁盘IO

4 B+树为什么矮?

MySQL中的B+树相对于其他类型的树(如B树)可能会显得“矮”的主要原因是其内部节点存储的是键值的引用(或者说是指针),而不是整个键值本身。

具体来说,B+树的特点是:

  1. 内部节点只存储键值的引用:在B+树中,所有的数据记录都存储在叶子节点中,而内部节点只存储键值及其对应的子节点的指针(引用)。这样做的好处是能够在内部节点中存储更多的键值引用,因为不需要为每个键值都分配额外的存储空间。

  2. 叶子节点形成链表:叶子节点之间通过指针形成链表,这样可以方便地进行范围查询和顺序访问。

由于B+树内部节点只存储了键值的引用,并且叶子节点形成了链表,因此整体高度相对较矮。相比之下,B树通常需要在内部节点存储完整的键值信息,这可能导致树的高度相对更高一些,尤其是在数据量大的情况下。

总结来说,MySQL中B+树“矮”的特性是因为它在设计上优化了内部节点的存储方式,使得树的高度相对较低,从而提高了查询效率。

5 什么是慢查询?出现了慢查询该如何排查?

慢查询是指在MySQL数据库中执行时间超过一定阈值(默认10秒)的SQL查询。慢查询可能会导致数据库性能下降,影响系统的正常运行。

处理慢查询的方法主要有以下几种:

  1. 开启慢查询日志:MySQL提供了慢查询日志功能,可以记录下所有执行时间超过设定阈值的SQL语句。通过分析慢查询日志,可以找出问题SQL。

  2. 优化SQL语句:对于执行时间较长的SQL语句,可以尝试进行优化,比如添加索引、改写SQL语句、减少查询的数据量等。

  3. 数据库设计优化:如果数据库设计不合理,也可能导致查询效率低下。可以考虑对数据库结构进行优化,比如进行数据分区、数据分片等。

  4. 硬件升级:如果数据库服务器的硬件性能不足,也可能导致查询效率低下。可以考虑升级硬件,比如增加内存、提高磁盘IO性能等。

  5. 使用性能分析工具:有很多数据库性能分析工具,如MySQL的Performance Schema、Explain等,可以帮助我们更好地理解和优化SQL查询。

  6. 使用缓存:对于一些查询结果不经常变化,但计算量大的查询,可以考虑使用缓存来提高查询效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

低代码和制造企业数字化转型成功的关系是什么

针对制造企业特别繁多的应用场景、特别大量的数据以及特别复杂的业务流程等特性,低代码能够更贴合制造企业的应用需求,更符合低代码平台为企业带来的价值,即(低代码平台)即服务。 用低代码与平台的融合力量搭建起企业敏捷的数字底座&#xff…

14-22 剑和远方2 - 深度神经网络中的学习机制

概论 在第一部分中,我们深入探讨了人工智能的兴衰简史以及推动人工智能发展的努力。我们研究了一个简单的感知器,以了解其组件以及简单的 ANN 如何处理数据和权重层。在简单的 ANN 中,不会对数据执行特定操作。ANN 中的激活函数是一个线性函…

Node.js_fs模块

文件删除 文件重命名和移动(本质都是修改路径) 文件夹操作 创建文件夹(mkdir) 读取文件夹(readdir) (打印出来是该文件夹下名称的数组形式) 读取当前的文件夹(readdir) 删除文件夹 (rmdir) 查看资源状态…

一家虚拟电厂繁忙的一天

早晨:准备与监控 7:00 AM - 起床与检查 虚拟电厂(VPP)团队的成员早起,开始检查电力系统的状态和最新的市场动态。使用专用的监控软件,查看分布式能源资源(DERs)的实时数据,包括太阳…

【Linux】网络新手村

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 引言 今天,我们就开始学习Linux网络相关的内容。这篇博客作为Linux网络板块的第一篇博客看,我们首先要带着大家明白Linux网络的一些名词的概念,为之后的学习扫清障碍。然后我…

MMM(Master-Master replication manager for MySQL,MySQL主主复制管理器)

概述 MMM(Master-Master replication manager for MySQL,MySQL主主复制管理器) MMM是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发,主要用来监控和管理 MySQL Master-Master (双主&#xf…

opencv实现目标检测功能----20240704

早在 2017 年 8 月,OpenCV 3.3 正式发布,带来了高度改进的“深度神经网络”(dnn)模块。 该模块支持多种深度学习框架,包括 Caffe、TensorFlow 和 Torch/PyTorch。这次我们使用Opencv深度学习的功能实现目标检测的功能,模型选用MobileNetSSD_deploy.caffemodel。 模型加载…

GD 32中断系统实现

1.0 中断的概念 中断:简单来说就是打断的意思,在计算机系统中CPU在执行一个操作的时候,有一个比当前任务更为紧急的任务需要执行,cpu暂停当前任务转而去执行更为紧急任务的操作,执行完更为紧急任务之后再返回来执行原来未执行完的…

美股交易相关知识点 持续完善中

美股交易时间 美东时间:除了凌晨 03:50 ~ 04:00 这10分钟时间不可交易以外,其他时间都是可以交易的。 如果是在香港或者北京时间下交易要区分两种: 美东夏令时:除了下午 15:50 ~ 16:00 这10分钟时间不可交易以外,其他时间都是可…

1012-27SF 同轴连接器

型号简介 1012-27SF是Southwest Microwave的2.92 mm连接器。该连接器使用不锈钢合金外壳和镀金接触表面提供了良好的耐腐蚀性和耐磨损性,延长了连接器的使用寿命。适用于高频应用,最高可达 40 GHz,使其适用于微波和射频通信、雷达系统等领域。…

14-31 剑和诗人5 - 使用 AirLLM 和分层推理在单个 4GB GPU 上运行 LLama 3 70B

利用分层推理实现大模型语言(LLM) 大型语言模型 (LLM) 领域最近取得了显著进展,LLaMa 3 70B 等模型突破了之前认为可能实现的极限。然而,这些模型的庞大规模给其部署和实际使用带来了巨大挑战,尤其是在资源受限的设备上,例如内存…

pnpm介绍

PNPM 是一个 JavaScript 包管理器,类似于 npm 和 Yarn。它的全称是 "Performant npm",主要设计目标是优化包的安装和管理过程,以提升速度和效率。PNPM 的主要特点包括: 符号链接(Symlink)&#x…

数据结构--二叉树相关题2(OJ)

1.比较对称二叉树(镜像二叉树) 二叉树相关题1中第二题的变形题。先去看1哦! 左子树和右子树比较 bool _isSymmetric(struct TreeNode* p, struct TreeNode* q) {if (p NULL && q NULL)return true;//如果两个都为空则是相等的if …

【WEB前端】---HTML---结构---笔记

目录 1.标签---单标签和双标签 1.1单标签 1.2双标签 2.基本结构标签 2.1HTML标签 2.2文档头部标签 2.3文档标题标签 2.4文档的主题标签 3.常用的标题标签 (n∈[1,6]) 4.段落标签 5.换行标签 6.文本格式化标签 6.1粗体 6.2倾斜 6.3删除线 6.4下划线 7.div和spa…

Android:自定义View

一、简介 点击查看创建自定义视图组件中文官网 Android 提供了一个复杂而强大的组件化模型,用于基于基本布局类 View 和 ViewGroup 构建界面。该平台包含各种预构建的 View 和 ViewGroup 子类(分别称为 widget 和布局),可供您用来…

大舍传媒:如何在海外新闻媒体发稿报道摩洛哥?

引言 作为媒体行业的专家,我将分享一些关于在海外新闻媒体发稿报道摩洛哥的干货教程。本教程将带您深入了解三个重要的新闻媒体平台:Mediterranean News、Morocco News和North African News。 地中海Mediterranean News Mediterranean News是一个知名…

Java中获取Class对象的三种方式

Java中获取Class对象的三种方式 1、对象调用getClass()方法2、类名.class的方式3、通过Class.forName()静态方法4、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java中,Class对象是一个非常重要的概念,它代…

高职计算机应用技术专业教学解决方案

前言 随着信息技术的飞速发展,计算机应用技术专业在高职教育中占据了举足轻重的地位。面对日益增长的行业需求和不断变化的教育环境,高职院校亟需探索创新的教学模式,以培养适应社会和经济发展的高素质技术技能型人才。唯众《高职计算机应用…

基于docker上安装elasticSearch7.12.1

部署elasticsearch 首先,先创建网络 # 创建网络 docker network create es-net拉取elasticSearch的镜像 #拉取镜像 docker pull elasticsearch:7.12.1创建挂载点目录 # 创建挂载点目录 mkdir -p /usr/local/es/data /usr/local/es/config /usr/local/es/plugin…

【Linux开发实战指南】基于UDP协议的即时聊天室:快速构建登陆、聊天与退出功能

author: bbxwg system_version: Ubuntu 22.04 Time : 2024-07-04 目录 技术简单讲解: UDP (User Datagram Protocol) 链表 父子进程 信号 基于UDP的即时聊天室系统:客户端与服务器端实现 客户端操作步骤 服务器端操作步骤 系统版本&#xff…