MySQL优化常见面试题

文章目录

      • 1.在MySQL中如何定位慢查询
      • 2.SQL语句执行很慢,如何分析
      • 3.什么是索引
      • 4.索引的底层结构了解过嘛
      • 5.B树和B+树的区别是什么
      • 6.什么是聚簇索引什么是非聚簇索引
      • 7.什么是回表查询
      • 8.什么是覆盖索引
      • 9.MySQL超大分页如何处理
      • 10.索引创建原则有哪些
      • 11.什么情况下索引会失效
      • 12.对sql优化的经验
        • 表的设计优化
        • SQL语句优化

1.在MySQL中如何定位慢查询

  1. 采用运维的监控系统Skywalking,可以监测出哪个接口,最终因为是sql的问题
  2. 在mysql中开启慢查询日志,我们设置的值是2秒,一旦sql执行超过2秒就会记录到日志中(调试阶段)
开启MySQL慢日志查询开关
slow_query_log=1
设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=1

2.SQL语句执行很慢,如何分析

可以采用MySQL自带的分析工具explain来去查看这条sql的执行情况
● 通过key和key_len检查是否命中了索引(索引本身存在是否有失效的可能)
● 通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描
● 通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复

3.什么是索引

● 索引是帮助MySQL高效获取数据的数据结构(有序)
● 提高数据检索的效率,降低数据库的IO成本(不需要全表扫描)
● 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗

4.索引的底层结构了解过嘛

● MySQL默认的存储引擎InnoDB采用的B+树来存储索引
● B+树阶数更多,路径更短
● 磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据
● B+树偏于扫库和区间查询,叶子节点是一个双向链表

5.B树和B+树的区别是什么

● 在B树中,非叶子节点和叶子节点都会存放数据,而B+树的所有数据都会出席那在叶子节点中,在查询的时候,B+树查找效率更加稳定
● 在进行范围查询的时候,B+树效率更高,因为B+树都在叶子节点存储,而且叶子节点是一个双向链表

6.什么是聚簇索引什么是非聚簇索引

● 聚簇索引(聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个
● 非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个

7.什么是回表查询

通过二级索引找多对应的主键值,到聚簇索引中查找整行数据,这个过程就是回表

8.什么是覆盖索引

覆盖索引是指查询使用了索引,返回的列,必须在索引中全部被找到
● 使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高
● 如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select *

9.MySQL超大分页如何处理

问题:在数据量比较大时,limit分页查询,需要对数据进行排序,效率低
解决方案:覆盖索引+子查询
select * from tb_sku limit 9000000,10
这条sql语句可以优化为
select * from tb_sku t,(select id from tb_sku order by id limit 9000000,10) a where t.id = a.id

10.索引创建原则有哪些

  1. 数据量较大(超过10万以上),且查询比较频繁的表
  2. 常作为查询条件、排序、分组的字段
  3. 字段内容区分度高
  4. 内容较长,使用前缀索引
  5. 尽量联合索引
  6. 要控制索引的数量
  7. 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它

11.什么情况下索引会失效

  1. 违反最左前缀法则
  2. 范围查询右边的列,不能使用索引
  3. 不要在索引列上进行运算操作,索引将失效
  4. 字符串不加单引号,造成索引失效。(类型转换)
  5. 以%开头的Like模糊查询,索引失效

12.对sql优化的经验

表的设计优化
  1. 比如设置合适的数值(tinint int bigint),要根据实际情况选择
  2. 比如设置合适的字符串类型(char和varchar)char定长效率高,varchar可变长度,效率稍低
SQL语句优化
  1. select语句务必指明字段名称(避免直接使用select *)
  2. SQL语句要避免照成索引失效的写法
  3. 尽量用union all代替union ,union会多一次过滤,效率低
  4. 避免在where子句中对字段进行表达式操作
  5. Join优化 能用innerjoin就不用left join right join,如必须使用 一定要以小表为驱动
    内连接会对两个表进行优化,优先把小表放在外边,把大表放在里边。但left join和right join,不会重新调整顺序

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

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

相关文章

【算法练习】29:插入排序学习笔记

一、插入排序的算法思想 原理:将一个无序的数据序列逐步转化为有序序列。算法将待排序的数组分为两个部分已排序部分和未排序部分。 时间复杂度:插入排序的时间复杂度在最坏、平均和最好情况下的表现相同,均为 ,其中 n 是待排序数…

极狐GitLab对接OAuth2实现SSO

本文作者:极狐(GitLab) 高级解决方案架构师 武让 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 企…

Python处理PDF:在PDF文档中插入页眉和页脚

在处理篇幅较长、结构复杂的PDF文档时,页眉和页脚的设计与插入就显得尤为重要。它们不仅扮演着美化文档、提升专业度的角色,更承担了导航指引、信息标注的重要功能。 页眉通常用于展示文档的标题或章节名称,有助于读者在翻阅过程中迅速定位所…

Java - 赋值运算符

在这个实战中,我们将学习赋值运算符的使用方法。首先,我们将介绍简单赋值运算符的基本概念和语法格式。然后,我们将通过案例演示来加深对赋值运算符的理解。接下来,我们将对比Java和Python这两种不同的编程语言,探讨它…

spring rest

controller 类的注解 Controller RequestMapping(“/api/ads”)类的方法的注解 ResponseBody GetMapping(“/postAds/{ad_id}”) - 查 PostMapping() - 增 PutMapping() - 改 DeleteMapping() PatchMapping()类的方法的参数的注解 PathVariable() RequestBody() RequestParam()…

移动端网络库行业动态-整理

欢迎各位同行补充。 阿里: 2023.12 淘宝移动端统一网络库的架构演进和弱网优化技术实践 http://www.52im.net/thread-4470-1-1.html 网易: cronet 多端统一,2021.11 网易云音乐网络库跨平台化实践:https://segmentfault.com/a/1…

电能质量管理解决方案探讨 安科瑞 许敏

电能质量在线监测装置 本办法对发电企业(包括分布式电源)、电网企业、用电企业的电能质量管理均有明确要求,要求在发电企业并网点、电网企业非线性设施、用电企业公共连接点设置电能质量监测装置,这会促进市场对电能质量在线监测…

理解 编译和链接

目录 1. 翻译环境和运行环境 2. 翻译环境 2.1 预处理(预编译) 2.2 编译 2.2.1 词法分析: 2.2.2 语法分析 2.2.3 语义分析 2.3 汇编 2.4 链接 3. 运行环境 1. 翻译环境和运行环境 在ANSI C的任何一种实现中,存在两个不同…

Linux开发--进程

经典五问: 1.什么是程序?什么是进程? 从是否运行进行判断: gcc xxx -o pro,磁盘中生成的pro文件,就是程序 进程是程序一次运行活动 程序是静态的概念,进程是动态的概念。 2.如何查看系统中的进程: 在l…

二叉树练习day.6

654.最大二叉树 链接:. - 力扣(LeetCode) 题目描述: 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前…

C盘突然爆满,并且清理空间后,马上又会爆满

C盘突然爆满,并且清理空间后,马上又会爆满 原因解决 原因 idea本地在跑数据打印日志,导致产生了一个名为idea_test_1.out的文件,这个文件在持续增大 解决 手动删除idea_test_1.out,或者等任务跑完也会自动删除&…

MySQL——全文检索

不是所有的数据表都支持全文检索 MySQL支持多种底层数据库引擎,但是并非所有的引擎支持全文检索 ,目前最常用引擎是是MyISAM和InnoDB;前者支持全文检索,后者不支持。 booolean模式操作符 实验: 表productnotes &…

大学 Python 程序设计实验报告基于自定义函数的程序设计

目录: 一、实验目的二、实验要求三、实验内容与程序代码 一、实验目的 掌握自定义函数的定义和使用,掌握递归函数和匿名函数的设计和使用、掌握常用标准库和第三方库的使用。 二、实验要求 函数的定义、调用,函数的参数调用。递归函数的设…

Testng测试框架(5)--依赖

有时候,你需要按照特定的顺序调用测试方法。这里有几个例子: 在运行更多测试方法之前,确保一定数量的测试方法已经完成且成功。 在初始化你的测试时,同时希望这些初始化方法也是测试方法(用Before/After标记的方法不…

测试用例的编写方式

学习目标 能对穷举场景设计测试点能对限定边界规则设计测试点能对多条件依赖关系进行设计测试点能对于项目业务进行设计测试点 目录 等价类划分法案例 等价类划分 说明:在所有测试数据中,具有某种共同特征的数据集合进行划分分类: 有效等…

线程池参数如何设置

线程池参数设置 hello丫,各位小伙伴们,好久不见了! 下面,我们先来复习一下线程池的参数 1、线程池参数有哪些? corePoolSize(核心线程数):线程池中的常驻核心线程数。即使这些线程…

Java与Kotlin语言的特色之处

一、Java特色之处: 1.多异常捕获 一个try块可能捕获到多个异常,可以使用多个catch块分别处理每个异常,也可以使用一个catch块处理多个异常(多个异常使用管道符|分隔)。 多个catch块代码: try{ }catch(IOExc…

rancher踩坑日志-删除rancher接入后创建namespace失败(还继续走rancher的逻辑)

创建新的命名空间报错 [haimaKS-STAG-NODE01 ~]$ kubectl create namespace test01 Error from server (InternalError): Internal error occurred: failed calling webhook "rancher.cattle.io.namespaces.create-non-kubesystem": Post "https://rancher-web…

拥抱Linux,拥抱开源,拥抱未来

拥抱Linux,拥抱开源,拥抱未来 在这一系列的Linux专栏博客中,我们从入门到进阶,从技能到生态,再到未来展望,全方位地探讨了Linux的方方面面。Linux已经成为了我们数字生活中不可或缺的一部分,它正在深刻地影响和改变着我们的世界。 1. Linux:技术的力量 Linux不仅仅是一个操作…

FMEA与各设计工具之间有哪些联系——SunFMEA软件

在设计领域,FMEA与其他设计工具之间存在着紧密的关系,这些工具共同支持设计师在产品开发的各个阶段做出明智的决策,今天SunFMEA软件和大家一起了解FMEA与各设计工具之间的联系。 首先,FMEA与CAD(计算机辅助设计&#…