一、MySQL如何进行SQL调优?

我的回答:

面试官好!我想从SQL语句本身和数据库结构两方面来做MySQL的SQL调优。

        首先会优化SQL写法,比如避免用SELECT *、减少子查询嵌套,用JOIN代替,还有合理使用索引,比如给查询频繁的字段建索引,同时避免索引失效的情况,像用函数操作索引列。

        另外,会关注表结构设计,比如拆分大表、使用合适的数据类型。还会通过慢查询日志定位低效SQL,用EXPLAIN分析执行计划。我在学习中试过给查询频繁的字段加索引,查询效率确实提升了不少,这让我觉得调优能直接解决实际问题,所以也在持续积累这方面的经验,希望能更好地保证数据库性能。

回答重点官方答案:

平时进行调优,主要是观察慢SQL,然后利用explain分析查询语句的执行计划来优化查询语句。

1.合理设计索引,利用联合索引进行覆盖索引的优化,避免回表的发生,减少一次查询和随机I/0。

2. 避免使用select *,只查询必要的字段

3.避免在SQL中进行函数计算等操作,使得无法命中索引。

4.避免使用前缀带 % 的模糊查询,导致全表扫描

5.注意联合索引需要满足最左匹配规则

6.不要对无索引字段进行排序操作

7.连表查询还要注意不同字段的字符集是否一致,否则也会导致全表扫描。

除此之外,还可以利用缓存来优化,一些变化少或者访问频繁的数据设置到缓存中,可以减轻数据库的压力,提升查询效率,还可以通过业务来优化,例如少展示一些不必要的字段,减少多表查询情况,将列表查询替换成分页分批查询等等。

若接着问explain执行计划中的各个字段

重点关注下面字段

二、如何使用MySQL的explain语句进行查询分析?

我的答案:

首先就是要在需要分析的SQL前加上explain,执行后会得到一张表,里面的字段能反映查询的关键信息,比如

看type字段,它表示连接类型,像const,eq_ref是比较好的。如果出现all就是全表扫描,就需要优化。

possible key字段是可能用到的索引。

key字段能看出实际用到的索引,如果是null就说明没走索引,此时要检查索引设计或SQL写法。

key_len是索引中使用的字节数,是索引字段最大可能长度,长度越短越好

rows字段大概估计要扫描的行数,数值越小越好。

我之前联系的时候,写了一个没有加索引的sql,用explain发现type是all,rows很大,加了索引之后,type变成ref,rows小了很多。查询速度快了很多。现在我每次写复杂sql都会先用explain分析一下,看是否有全表扫描、索引失效的情况,再针对性优化,慢慢的也更能理解索引和查询执行的关系了,以后会继续用这个工具提升SLQ效率

回答重点官方答案:

explain 主要用来 SQL 分析,它主要的属性详解如下:

  • id :查询的执行顺序的标识符,值越大优先级越高。简单查询的 id 通常为 1,复杂查询(如包含子查询或 UNION)的 id 会有多个。
  • select_type(重要):查询的类型,如 SIMPLE(简单查询)、PRIMARY(主查询)、SUBQUERY(子查询)等。
  • table :查询的数据表。
  • type(重要):访问类型,如 ALL(全表扫描)、index(索引扫描)、range(范围扫描)等。一般来说,性能从好到差的顺序是:const > eq_ref > ref > range > index > ALL。
  • possible_keys :可能用到的索引。
  • key(重要):实际用到的索引。
  • key_len :用到索引的长度。
  • ref :显示索引的哪一列被使用。
  • rows(重要):估计要扫描的行数,值越小越好。
  • filtered :显示查询条件过滤掉的行的百分比。一个高百分比表示查询条件的选择性好。
  • Extra(重要):额外信息,如 Using index(表示使用覆盖索引)、Using where(表示使用 WHERE 条件进行过滤)、Using temporary(表示使用临时表)、Using filesort(表示需要额外的排序步骤)。

type 详解:

  • system:表示查询的表只有一行(系统表)。这是一个特殊的情况,不常见。
  • const:表示查询的表最多只有一行匹配结果。这通常发生在查询条件是主键或唯一索引,并且是常量比较。
  • eq_ref:表示对于每个来自前一张表的行,MySQL 仅访问一次这个表。这通常发生在连接查询中使用主键或唯一索引的情况下。
  • ref:MySQL 使用非唯一索引扫描来查找行。查询条件使用的索引是非唯一的(如普通索引)。
  • range:表示 MySQL 会扫描表的一部分,而不是全部行。范围扫描通常出现在使用索引的范围查询中(如 BETWEEN、>,<,>=,<= )。
  • index:表示 MySQL 扫描索引中的所有行,而不是表中的所有行。即使索引列的值覆盖查询,也需要扫描整个索引。
  • all(性能最差):表示 MySQL 需要扫描表中的所有行,即全表扫描。通常出现在没有索引的查询条件中。

三、MySQL中的索引数量是否越多越好,为什么?

我的回答:

索引并不是越多越好,因为索引不论是从时间上还是空间上都是有一定成本的。

索引虽然能够加快查询速度,但会增加写操作(插入、更新、删除)的开销,每次增删改数据,不仅仅要修改表中数据,还要维护对应索引结构,索引越多,维护成本越高,可能拖慢写入性能。而且索引会占用额外的存储空间,太多的索引会浪费磁盘空间

另外查询时数据库可能会在多个索引中选择不合适的,反而影响查询效率。我之前试过给一张表加了多个索引,结果插入数据的速度明显慢了许多,所以索引要按需创建,要在查询和写入之间找平衡,所以我现在会根据实际查询场景合理建索引,避免盲目添加。

回答重点(官方答案)


索引并不是越多越好。因为索引不论从时间还是空间上都是有一定成本的

  1. 从时间上
    每次对表中的数据进行增删改 (INSERT、UPDATE 或 DELETE) 的时候,索引也必须被更新,这会增加写入操作的开销。例如删除了一个 name 为张三的记录,不仅主键索引上需要修改,如果 name 字段有索引,那么 name 索引也需要修改,所以索引越多需要修改的地方也就越多,时间开销就大了,并且 B+ 树可能会有页分裂、合并等操作,时间开销就会更大。
    还有一点需要注意:MySQL 有个查询优化器,它需要分析当前的查询,选择最优的计划,这过程就需要考虑选择哪个索引的查询成本低。如果索引过多,那么会导致优化器耗费更多的时间在选择上,甚至可能因为数据的不准确而选择了次优的索引。

  2. 从空间上
    每建立一个二级索引,都需要新建一个 B+ 树,默认每个数据页都是 16KB,如果数据量很大,索引又很多,占用的空间可不小。

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

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

相关文章

华中科大首创DNN衍射量子芯片登《Science Advances》:3D打印实现160μm³高维逻辑门

01 前言华中科技大学王健/刘骏团队在《Science Advances》发表突破性研究&#xff0c;利用飞秒激光三维打印技术&#xff0c;制造出全球首个聚合物基超紧凑高维量子光芯片。该芯片仅160微米见方&#xff08;约头发丝直径的1.5倍&#xff09;&#xff0c;却实现了光子空间模式的…

【排序】插入排序

如果你已经对排序略知一二&#xff0c;现在正在复习排序的一些重点知识 ------------------------------------------------------------------------------------------------------------------------- 点赞收藏&#x1f308;&#xff0c;每天更新总结文章&#xff08;多以图…

扣子Coze怎么模仿人类输出(分段输出)?

效果&#xff1a; 让AI回复的更像人类 教程&#xff1a; 工作流&#xff1a; 假设大模型节点就是需要的回复&#xff0c;并且已经按句号&#xff08;。&#xff09;区别开每句话 后面连接一个 文本处理 节点&#xff0c;选择“字符串分隔”&#xff0c;按“。”进行分割 分…

Android 应用开发 | 一种限制拷贝速率解决因 IO 过高导致系统卡顿的方法

文章目录一、问题背景二、代码实现一、问题背景 经常做 Android 应用的小伙伴应该会有经验&#xff0c;就是如果应用在写入文件的时候&#xff0c;即使写文件的动作是在子线程&#xff0c;也会出现 UI 上的卡顿&#xff0c;这是因为文件的 IO 是由内核去完成的&#xff0c;此时…

力扣面试150(19/150)

7.7 12. 整数转罗马数字 七个不同的符号代表罗马数字&#xff0c;其值如下&#xff1a; 符号值I1V5X10L50C100D500M1000 罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则&#xff1a; 如果该值不是以 4 或 9 开头&#xff0c;…

数据结构与算法——从递归入手一维动态规划【1】

前言&#xff1a; 简单记录对左程云系列算法课程--算法讲解066【必备】的学习&#xff0c;这是第一篇。主要提供C代码和一些简单的个人理解&#xff0c;如需要细致讲解请移步原视频。 涉及内容&#xff1a; 斐波那契数列、动态规划 参考视频&#xff1a; 左程云--算法讲解…

搭建个人博客系列--Nacos 注册中心

基础项目已完成&#xff0c;接下来就是SpringCloud的各种组件了。 那你又要问&#xff1a;既然有Nacos为什么之前还装了Apollo&#xff1f; 那你别管&#xff0c;那不得什么都会点&#xff0c;不然怎么找工作。干就完了。 一、安装Nacos 管他三七二十一&#xff0c;先在doc…

前端实习总结——案例与大纲

以下是一个结合真实场景的前端面试案例&#xff0c;包含面试流程、核心问题、候选人回答思路及面试官考察点&#xff0c;可直观感受如何在面试中展现实习/项目经历&#xff1a; 案例背景 候选人&#xff1a;应届生&#xff0c;有6个月前端实习经历&#xff0c;参与过“企业内部…

Web前端开发: :where(伪类函数选择器)

:where(伪类函数选择器)&#xff1a;:where() 是 CSS Selectors Level 4 规范中引入的一个强大的伪类函数选择器&#xff0c;它允许开发者以简洁的方式编写复杂的选择器&#xff0c;同时具有独特的优先级特性。核心概念&#xff1a;:where() 伪类函数选择器与 :is() 非常相似&a…

EfficientVMamba: Atrous Selective Scan for Light Weight Visual Mamba论文精读(逐段解析)

EfficientVMamba: Atrous Selective Scan for Light Weight Visual Mamba论文精读&#xff08;逐段解析&#xff09; 论文地址&#xff1a;https://arxiv.org/abs/2403.09977 CVPR 2024 Abstract. Prior efforts in light-weight model development mainly centered on CNN an…

Integer缓冲区

文章目录常见面试题&#xff1a;总结Integer缓冲区是Java预先创建的一个固定范围的Integer对象缓存池&#xff08;默认-128到127&#xff09;&#xff0c;用于自动复用频繁使用的整数值&#xff0c;减少内存开销和对象创建。当通过自动装箱或Integer.valueOf()生成该范围内的整…

[国家电网备考]计算机网络

计算机网络的概述 概念: 用通信设备与线路将地理位置不同,功能独立的计算机系统互连起来,以功能完善的网络软件实现网络中资源共享和信息传递的系统 自治计算机: 能够自我管理,配置,维护的计算机(目前我们使用的电脑) 以前的终端只有显示器,不能叫做自治计算机 计算机网络向用户…

在 Linux(openEuler 24.03 LTS-SP1)上安装 Kubernetes + KubeSphere 的防火墙放行全攻略

目录 在 Linux&#xff08;openEuler 24.03 LTS-SP1&#xff09;上安装 Kubernetes KubeSphere 的防火墙放行全攻略 一、为什么要先搞定防火墙&#xff1f; 二、目标环境 三、需放行的端口和协议列表 四、核心工具说明 1. 修正后的 exec.sh 脚本&#xff08;支持管道/重…

HTTP 响应头信息详解

HTTP 响应头信息详解 引言 HTTP(超文本传输协议)是互联网上应用最为广泛的网络协议之一。在HTTP协议中,响应头信息是服务器向客户端发送的重要信息之一。响应头信息包含了关于响应的元数据,如状态码、内容类型、缓存策略等。本文将详细介绍HTTP响应头信息的概念、类型、作…

去掉长按遥控器power键后提示关机、飞行模式的弹窗

首先找到对应长短按power键的位置&#xff1a;frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.javaprivate final Runnable mPowerLongPress new Runnable() {Overridepublic void run() {// The context isnt readif (mLongPressOnPowerBe…

Redis-哨兵机制Sentinel

redis的主从复制模式下,一旦主节点出现了故障无法提供服务了,需要人工进行主从切换,同时大量的客户端需要被通知切换到新的主节点上,对于有了一定规模的应用来说,这种方案的延迟是无法接受的,于是redis2.8提供了Redis-Sentinel(哨兵)来解决这个问题. 目录 1.啥是哨兵节点: 2.r…

SQL 视图

SQL 视图 引言 SQL 视图是数据库管理系统中的一种重要概念,它允许用户以不同的方式查看数据库中的数据。本文将详细介绍 SQL 视图的概念、作用、创建方法以及在实际应用中的注意事项。 一、SQL 视图的概念 SQL 视图是数据库中的一种虚拟表,它并不存储实际的数据,而是基于…

ESP32-使用VSCODE 各种问题总结汇总

1 问题 1 1.1 具体问题描述-config:idf.customExtraPath 无法正确描述launch.json 中使用了一个变量&#xff1a; ${config:idf.customExtraPaths}但在 VSCode 的设置中&#xff0c;并没有找到对应的设置项 idf.customExtraPaths&#xff0c;所以无法解析。 1.2 问题解决 1.2.1…

【剪裁Patch】已标注的WSI剪裁Patch的处理流程(以QuPath软件得到的标注信息为例)

1. 整体处理思路 整体处理流程如图所示,概括来说就是:根据标注信息将WSI区分为肿瘤区域和正常区域,对这个区域进行采样裁剪得到具有Patch级别标签的Patch。 当然,这里的Patch标签是根据标注信息决定的,如果标注的是癌症亚型信息,那么也可以将不同亚型的Patch区分出来。 …

Qt 与Halcon联合开发九:算法类设计与实现讲解(附源码)

一、设计背景 在机器视觉系统中&#xff0c;算法是系统的核心。不同产品、不同项目对图像处理的要求不尽相同&#xff0c;因此算法需要具备&#xff1a; 灵活拓展&#xff1a;方便添加新算法统一调用&#xff1a;界面或上层逻辑不关心算法细节结构清晰&#xff1a;便于维护与…