首页 > 数据库 >MySQL面试内容2

MySQL面试内容2

时间:2024-03-19 13:59:32浏览次数:33  
标签:存储 索引 查询 回表 面试 内容 MySQL 节点

1、MySQL面试内容

2、如何定位慢查询

*聚合查询

*多表查询

*表数据量过大查询

*深度分页查询

表象: 页面加载过慢、接口压测响应时间过长(超过1s)

2.1 使用开源组件

调试工具: Arthas

运维工具: Prometheus、Skywalking

2.2 使用MySQL自带的监控

MySQL自带慢日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志,如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

#开启MySQL慢日志查询开关
slow_query_log = 1
#设置慢日志时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2

配置完毕之后,通过以下指令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息。/var/lib/mysql/localhost-slow.log

2.3 相关面试内容

如何定位慢查询?

1. 介绍一下当时产生问题的场景(我们当时的一个接口测试的时候非常的慢,压测结果大概是5秒钟)

2.我们系统中当时采用了运维工具(Skywalking),可以检测出哪个接口,最终因为是sql的问题。

3.在mysql中开启了慢日志查询,我们设置的值为2秒,一旦sql执行超过2秒就会记录到日志中(调试阶段,上线后会影响性能)。

2.4 SQL执行很慢,如何分析

聚合查询、多表查询、表数据量过大查询、深度分页查询。

采用 EXPLAIN 或者 DESC命令获取MySQL如何执行SELECT语句的信息。

EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件;

2.5 一个SQL执行很慢,如何分析

possible_key 当前SQL可能会使用到的索引

key 当前sql实际命中的索引

key_len 索引占用的大小

Extra 额外的优化建议

通过key key_len 查看是否可能会命中索引。

extra

含义

Using where;Using Index

查找使用了索引,需要的数据都在索引中能找到,不需要回表查询数据

Using index condition

查找使用了索引,但是需要回表查询数据

  • type 这条sql的连接类型,性能由好到差为NULL、system、const、eq_ref、ref、range、index、all
  • system: 查询系统中的表
  • const:根据主键查询
  • eq_ref: 主键索引查询或唯一索引查询
  • ref: 索引查询
  • range:范围查询
  • index:索引树扫描
  • all: 全盘扫描(最慢)

如果这个SQL执行的很慢,如何分析呢?

如果一条sql执行很慢的话,我们通常会使用mysql自动的执行计划explain来去查看这条sql的执行情况,比如在这里面可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,可以判断索引是否有失效的情况。第二个,可以通过type字段查看sql是否有进一步优化空间,是否存在全索引扫描或全盘扫描,第三个可以通过extra建议来判断,是否出现了回表的情况,如果出现了可以尝试添加索引或修改返回字段来修复。

3、MySQL支持的存储引擎有哪些,有什么区别?

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库,索引存储引擎也可以称为表类型。

特性

MyISAM

InnoDB

MEMORY

事务安全

不支持

支持

不支持

锁机制

表锁

表锁/行锁

表锁

外键

不支持

支持

不支持

MySQL体系结构

InnoDB存储的特点

介绍:

InnoDB是一种兼顾高可靠性的通用存储引擎,在MySQL5.5之后,InnoDB是默认的MySQL存储引擎。

特点:

  • DML操作遵循ACID模型,支持事务
  • 行级锁,提高并发访问性能
  • 支持外键 FOREIGN KEY约束,保证数据的完整性和正确性

文件

  • xxx.ibd: xxx代表的是表名,InnoDB引擎的每张表都会对应这样一个表空间文件,存储该表的表结构(frm、ibd)、数据和索引。
  • xxx.frm 存储表结构(MySQL8.0时,合并在表名.ibd中)

4、关于存储引擎的面试

MySQL支持哪些存储引擎,他们的区别是什么?

  • InnoDB 是mysql5.5 之后默认的存储引擎,支持事务、表级锁和行级锁、外键 使用比较多
  • myISAM 是早起的存储引擎,不支持事务 只支持表级锁 。
  • memory 主要把数据存储在内存中,支持表级锁,不支持事务和外键,用的不多。

6、关于索引内容

6.1 什么是索引

索引(index)是帮助MySQL高晓获取数据的数据结构(有序)。在数据之外,数据库系统还维护这满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以再这些数据结构上实现高级查找算法,这种数据结构就是索引。

6.2 索引的底层数据结构

B+树

数据结构对比

B-Tree

B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key。

B树与B+树对比:

1、磁盘读写代价B+树更低; 2、查询效率B+树更加稳定;3、B+树便于扫库和区间查询。

6.3 存储结构的面试内容

1、了解过索引吗?

索引在项目中还是比较常见的,它帮助MySQL高晓获取数据的数据结构。提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序成本,也能降低了CPU的消耗

2、索引的底层数据结构了解过吗

MySQL的默认的存储引擎InnoDB采用的B+树的数据结构来存储索引,选择B+数的主要的原因:第一阶数更多,路径更短;第二磁盘读写代价B+树更低,非叶子节点只存储指针,叶子节点存储数据;第三个B+树便于扫库和区间查询,叶子节点是一个双向链表。

3、B树和B+树的区别是什么?

第一:在B树中,非叶子节点和叶子节点都会存放数据,而B+树的所有数据都会存放在叶子节点,在查询的时候,B+树查找效率更加稳定。

第二:在进行范围查询的时候,B+树效率更高,因为B+树都在叶子节点存储,并且叶子节点是一个双向链表。

7、索引

7.1 什么是聚簇索引什么是非聚簇索引

聚集索引:将数据和索引放到了一块,索引结构的叶子节点保存了行数据。 特点:有且只有一个

二级索引:将数据和索引分开存储,索引结构的叶子节点关联的是对应的主键。 特点:可以有多个。

聚簇索引的选取规则:

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

索引面试内容:

知道什么是回表查询吗?

回表跟聚簇索引和非聚簇索引是有关系的,回表的意思是通过二级索引查询到对应的主键值,然后再通过主键值找到聚集索引中所对应的整行数据,这个过程就是回表。

知道什么是覆盖索引吗

覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中已经全部找到。

(非覆盖索引需要回表,使用id查询,直接走聚集索引,一次索引扫描,直接返回数据)

MYSQL超大分页怎么处理

可以使用覆盖索引解决

(在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率越低)

select * from tb_sku limit 9000000,10;

当分页查询时,如果执行 limit 90000000,10,此时需要MySQL排序前90000010记录,

仅仅返回9000000-90000010的记录,其它记录丢弃,查询排序的代价非常大。

优化:一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询形式优化。

select * 
from tb_sku t,
  (select id from tb_sku order by id limit 9000000000,10)a
where t.id = a.id;

索引创建的原则

业务中用到的 主键索引 ,唯一索引,二级索引

1)针对于数据量大,且查询比较频繁的表创建索引。 单标超过10数据(增加用户体验)

2)针对常用作查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。

3)尽量选择区分度较高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。

4)如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀商机。

5)尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。

6)要控制索引的数量,索引并不是多多益善,索引越多,维护索引的成本也就越大,会影响增删改查的效率。

7)如果索引列不能存储null值,请在创建表时使用 NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好确定哪个索引最有效地用于查询。

什么情况下回索引失效

索引失效的情况有很多,可以说一些自己遇到过的

1)违反最左前缀法则

如果索引了多列,要遵守最左前缀法则。

如果符合最左法则,但是出现跳跃某一列,只能最左列索引生效。

范围查询右边的列,不能使用索引。

2)不要在索引列上进行运算操作,索引将失效

explain select * from tb_seller where substring(name,3,2) = '科技'

3)字符串不加单引号,造成索引失效

由于,在查询时,没有对字符串加单引号,MySQL的查询优化器,会自动的进行类型转换,造成索引失效。

4)以 % 开头的Like模糊查询,索引失效。如果仅仅是尾部模糊匹配,索引不会失效。如果头部模糊匹配索引失效。

5)范围查询右边的列会索引失效。

SQL优化的经验

MySQL体系结构

标签:存储,索引,查询,回表,面试,内容,MySQL,节点
From: https://blog.csdn.net/goPlayJava/article/details/136840633

相关文章

  • MySQL虚拟列
    当我们谈论数据库优化时,经常会遇到各种技术和策略。其中,MySQL的虚拟列(也被称为生成列或存储列)是一个引人注目的特性。它不仅可以帮助开发者提高查询效率,还能为数据表提供额外的计算功能,而无需真正改变表的结构。在这篇文章中,我们将深入探讨MySQL虚拟列的发展、原理以及应用。一......
  • Mysql之刷盘机制
    一、刷盘机制总览刷盘过程mysql刷脏数据在写redo之后,逻辑跟oracle一致。checkpoint/commit->内存中的redo到redolog文件->内存中的脏数据到数据盘。但是mysql多一个环节,就是把binlog从binlogcache写入到binlog文件中。binlogcache不是共享内存,是为每个client分......
  • 配置MySQL-项目BotBattle
    目录数据库配置常用操作项目地址:https://github.com/aijisjtu/Bot-BattlegraphLRA[配置数据源]-->B[建立连接]B-->C[执行SQL语句]C-->D[处理结果]D-->E[关闭连接]配置数据源:设置数据库地址、用户名和密码等。建立连接:与数据库服务器建立通信通道......
  • 【MySQL】1.基础语句知识
    1.MySQL概述SQL登录mysql[-h127.0.0.1][-P3306]-uroot-p//连接mysqlSQL语句分类DDL(DataDefinitionLanguage)数据定义语言,用来定义数据库对象(数据库,表,字段)DML(DataManipulationLanguage)数据操作语言,用来对数据库表中的数据进行增删改DQL(DataQuery......
  • mysqly索引(explain 执行计划)
    关键词执行计划EXPLAIN+语句查看mysql优化后的语句showwarnings;EXPLAIN执行后,各列的含义要点:select_type如何查询表type如何查询行key如何使用索引key_len索引使用多少rows行预计使用多少extra表的额外信息1.idid列的编号是select的序列号......
  • Mysql之innodb架构
    Innodb存储引擎的架构内存结构BuferPool缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),然后再以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度。缓冲池以Page页为......
  • MySQL系列:索引失效场景总结
    相关文章数据库系列:MySQL慢查询分析和性能优化数据库系列:MySQL索引优化总结(综合版)数据库系列:高并发下的数据字段变更数据库系列:覆盖索引和规避回表数据库系列:数据库高可用及无损扩容数据库系列:使用高区分度索引列提升性能数据库系列:前缀索引和索引长度的取舍数据库系列:My......
  • 今天去面试,面试官问我什么是容器编排工具?Kubernetes
    今天去面试,面试官问我什么是容器编排工具?KubernetesKubernetes(简称k8s)是一个开源的容器编排平台,用于自动化应用程序部署、扩展和管理。它提供了一种高效的方式来管理容器化应用程序,使得开发人员和运维人员可以更好地协同工作。本文将介绍Kubernetes的集群架构和组件,并通过......
  • 面试官:volatile如何保证可见性的,具体如何实现?
    写在开头在之前的几篇博文中,我们都提到了volatile关键字,这个单词中文释义为:不稳定的,易挥发的,在Java中代表变量修饰符,用来修饰会被不同线程访问和修改的变量,对于方法,代码块,方法参数,局部变量以及实例常量,类常量多不能进行修饰。自JDK1.5之后,官网对volatile进行了语义增强,这让它......
  • 面试题整理
    1、自我介绍面试官好,我叫。我有5年多的软件测试经验。在工作中,熟练掌握了各种测试方法和工具,包括黑盒测试、白盒测试、自动化测试、性能测试、安全测试等。有一定的编程能力,能够根据需要编写测试用例和脚本。有良好的沟通能力和团队协作能力,能够与开发人员、产品经理等各部门人员......