首页 > 数据库 >面试篇-Mysql-1+慢sql+索引

面试篇-Mysql-1+慢sql+索引

时间:2024-07-14 10:55:33浏览次数:15  
标签:Mysql 使用 查询 索引 sql mysql 2.1

文章目录


前言

你们项目都使用过哪些关系型数据库,Mysql 用过吗,针对线上慢查询你们是怎么排查的,索引是什么,你们是怎么使用索引进行优化的。本文重点对面试的问题进行介绍,祝愿每位程序员都能上岸!!!


一、线上的慢sql 你们是怎么发现和处理的

1.1 发现慢sql:

1.1.1 通过开启mysql 的慢日志:

首先:慢sql 通体现在页面数据加载缓慢,接口的响应时间过长。
其次:慢sql 是测试人员进行压测时,在预发布环境发现有些接口的响应时间超过了2s,然后对我们进行了反馈。
然后:我们在预发布环境开启mysql 的慢日志,记录超过2s 的sql,将其存放在log 文件中:
在这里插入图片描述最后:配置完成后我们重启了mysql ,然后让测试人员配合压测,从慢日志中拿到了慢sql:

在这里插入图片描述

1.1.2 通过Skywalking 平台:

我们当时的系统部署了运维的监控系统Skywwalking,在展示的报表中可以看到是哪一个接口比较慢,并且可以分析这个接口哪部分比较慢,这里可以看到SOL的具体的执行时间,所以可以定位是哪个sql出了问题。
在这里插入图片描述

1.2 针对慢sql 你们是怎么处理的:

在Mysql 中提供了Explain 跟上要执行的sql ,可以看到sql 语句的执行计划,从结果中,我们主要关注sql 查询中对于索引的使用情况;

在这里插入图片描述

在结果中有个type 的字段,它是用来干嘛的,它都有哪些类型:

在这里插入图片描述通常如果type 出现了 index 全索引树的扫描,和all 全表扫描,意为这我们需要对sql 进行优化。

二、你了解过索引吗

2.1 索引是什么:

索引是一种b+ 树的数据结构,这种结构以某种方式引用数据,Myql 通过索引可以快速的定位数据。

2.1.1 索引为什么要用b+树实现,二叉树,b树不行吗

Mysql 使用b+ 树作为数据存储的底层结构,是综合了数的高度与查询效率的稳定性,综合考虑决定的。

首先,对于二叉树,二叉搜索树,红黑树来说,本质上它们都是二叉树,使用它们存储数据树的高度会变得非常大;其次二叉树在最坏的情况,会退化到链表结构,虽然红黑树可以通过左旋和右旋来维持树的平衡,但是数的总体高度依然很高,树的高度越高检索数据需要花费的时间也就越多。

在这里插入图片描述
b 树是在二叉树的基础上进行的优化,他可以有多个分叉,以此来降低树的高度
在这里插入图片描述B+Tree是在BTree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。b+ 树比b 树更有优势的地方在于:

  • 非叶子节点只存储指针,磁盘读写代价抵
  • 数据都在叶子节点查询效率稳定
  • 叶子节点双向链表,更好支持范围查询

2.1.2 你都知道哪些索引:

通常在Mysql 中,我们会用到它的聚促索引和二级索引;

它们的区别在于:
在这里插入图片描述在这里插入图片描述

你知道聚促索引的选取规则吗:

  • 如果存在主键,主键索引就是聚集索引。
  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。2
  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

2.1.3 你知道mysql 的回表吗:

Mysql的回表是先到二级索引中查询到id ,然后在去聚簇索引中遍历需要的id 获取到正好数据,因为有了第二次聚簇索引的遍历,所以这个过程被称之为回表。
在这里插入图片描述

2.1.4 你知道mysql 的覆盖索引吗:

覆盖索引是指查询使用了索引,返回的列,必须在索引中全部能够找到。

在这里插入图片描述

2.1.5 当项目中遇到深分页你们怎么处理的:

如sql 语句中有 limit 10000000 10 ,怎么保证sql 的效率。这种我们通查可以使用覆盖索引+子查询来处理(在子查询中得到需要的数据主键id);

在这里插入图片描述

2.1.6 你们项目中通常都对表中的哪些字段创建索引

  • 针对于数据量较大,且查询比较频繁的表建立索引。单表超过10万数据(增加用户体验)
  • 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
  • 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
  • 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
  • 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。
  • 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率,
  • .如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。

你们创建索引遵循的原则有哪些;首先,我们一般在表的数据量达到10w时,会对经常作为查询条件,分组,排序的字段创建索引;然后,我们会创建覆盖索引,然后一条sql 返回的值尽量使用覆盖索引;最后,对于大文本的字段,内容较长,我们通常使用前缀索引。

  • 数据量较大,且查询比较频繁的表;
  • 常作为查询条件、排序、分组的字段
  • 字段内容区分度高
  • 内容较长,使用前缀索引
  • 尽量联合索引
  • 要控制索引的数量
  • 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它

2.1.7 你们有没有遇到过索引失效的情况,你们是怎么排查的

项目中在表的字段建立了索引,但是查询的时候却没有用到过;通常是由于违反了索引查询的一些原则,比如:没有遵守最左匹配,在查询时 % 在前面,对字段进行了运算。

说下索引的最左匹配原则:

通常最左匹配原则体现在复合索引上,因为我们是对多个字段共同使用了一个索引树,索引树存储的节点数据也是按照 索引字段 从左到右进行建立的,此时当我们查询时,跳过了前面的字段,直接使用后面的字段进行查询,此时就有可能造成索引失效。
在这里插入图片描述范围查询,后面的列不会用到索引
在这里插入图片描述
在索引上的字段进行了运算:
在这里插入图片描述
字符串没有使用引号:
在这里插入图片描述
以% 开头 的查询:
在这里插入图片描述


总结

本位对线上慢sql 的排查及优化,以及索引的一些面试问题进行总结。

标签:Mysql,使用,查询,索引,sql,mysql,2.1
From: https://blog.csdn.net/l123lgx/article/details/140077477

相关文章

  • 【postgresql】时间函数和操作符
    日期/时间操作符加减操作符:+ 和 - 可以用于日期、时间、时间戳和时间间隔的加减操作。SELECT'2024-01-01'::date+INTERVAL'1day'as"date";;--结果:2024-01-02SELECT'2024-01-0112:00:00'::timestamp-INTERVAL'2hours'as"timestamp......
  • 【postgresql】锁
    PostgreSQL提供了多种锁模式来控制对表和行的并发访问,以确保数据的一致性和完整性。这些锁模式包括表级锁和行级锁,它们可以由应用程序显式控制,也可以在执行大多数PostgreSQL命令时自动获取。锁类型PostgreSQL类型的锁包括:表级锁(Table-LevelLocks):ACCESSSHARE:通常在SE......
  • flask+mysql入门案例
    在Flask中集成MySQL数据库进行用户管理是一个常见的项目需求。下面将提供一个基础的步骤和代码示例来理解如何从零开始搭建这样一个系统。1.环境准备首先确保你已经安装了Python和必要的包。你需要安装Flask和用于连接MySQL的包Flask-SQLAlchemy或者Flask-M......
  • 尚硅谷MySQL数据库入门到大牛_宋红康--学习建议
    【MySQL上篇:基础篇】【第1子篇:数据库概述与MySQL安装篇】p01-p11学习建议:零基础同学必看,涉及理解和Windows系统下MySQL安装【第2子篇:SQL之SELECT使用篇】p12-p48学习建议:学习SQL的重点,必须重点掌握,建议课后练习多写【第3子篇:SQL之DDL、DML、DCL使用篇】p49-p73学习建议:学习SQL的......
  • 双活mysql搭建
    主从搭建配置可以参考一篇文章,这篇文章是基于上一篇文章开始配置的https://www.cnblogs.com/zyp87/p/18295559主机配置说明:192.168.136.101mysql01centos7.92C4G192.168.136.102mysql02centos7.92C4G192.168.136.109vip防火墙主机互相放行firewa......
  • MySQL优化SQL查询语句的策略与实践
    在数据库管理和优化中,针对MySQL的SQL查询优化是提升性能的关键步骤。以下是一些实践性强且高效的策略,旨在减少查询时间,提高系统响应速度:1.精准索引策略,减少全表扫描索引优化:确保在WHERE和ORDERBY子句中涉及的列上创建索引。这不仅加快了数据检索速度,还降低了服务器负担。替......
  • SQLAlchemy 异步操作
    在现代的Python应用中,异步操作越来越受到重视,特别是在处理I/O密集型任务时。SQLAlchemy也提供了对异步操作的支持,结合aiomysql可以实现异步的数据库操作。环境准备首先,你需要安装aiomysql:pipinstallaiomysql步骤详解1.创建数据库驱动引擎我们需要创建一个异步的......
  • SQLAlchemy 执行原生 SQL 语句
    在使用SQLAlchemy进行数据库操作时,虽然ORM提供了强大的模型映射功能,但有时候直接使用原生SQL语句可能更加简单直率,甚至性能更优。下面我们来看一下如何在SQLAlchemy中执行原生的SQL语句。执行原生SQL语句的步骤构造SQL语句调用session中的execute方法执行,得......
  • FOFA网络空间安全搜索引擎的使用
    一、FOFA是什么?FOFA是一款网络空间测绘的搜索引擎,旨在帮助用户以搜索的方式查找公网上的互联网资产。简单来说,FOFA的使用方式类似于谷歌或百度,用户可以输入关键词来匹配包含该关键词的数据。不同的是,这些数据不仅包括像谷歌或百度一样的网页,还包括像摄像头、打印机、数据库......
  • 网络安全——SQL注入
    一、概念SQL注入原理        在与数据库交互的地方程序没有对用户的输入做严格的过滤和限制,导致用户可以构造恶意的sql语句拼接在参数后面,然后带到数据库中执行,sql注入属于服务端攻击,和操作系统和编程语言无关。SQL注入提交方式        get......