MySQL篇

文章目录

  • 一、MySQL-优化
    • 1、在MySQL中,如何定位慢查询?
    • 2、SQL语句执行很慢, 如何分析呢?
    • 3、了解过索引吗?(什么是索引)
    • 4、索引的底层数据结构了解过嘛 ?
    • 5、什么是聚簇索引什么是非聚簇索引 ?
    • 6、知道什么是回表查询嘛 ?
    • 7、知道什么叫覆盖索引嘛 ?
    • 8、MYSQL超大分页怎么处理 ?
    • 9、索引创建原则有哪些?
    • 10、什么情况下索引会失效 ?(在联合索引的情况下)
    • 11、谈一谈你对sql的优化的经验
  • 二、事务
    • 1、事务的特性是什么?可以详细说一下吗?
    • 2、并发事务带来哪些问题?怎么解决这些问题呢?MySQL的默认隔离级别是?
      • 2.1. 并发事务问题
      • 2.2. MySQL的默认隔离级别
    • 3、undo log和redo log的区别
    • 4、事务中的隔离性是如何保证的呢?
    • 5、解释一下MVCC
    • 6、MySQL主从同步原理
    • 7、分库分表

一、MySQL-优化

1、在MySQL中,如何定位慢查询?

  1. 方案一:开源工具

调试工具:Arthas
运维工具:Prometheus 、Skywalking
在这里插入图片描述

  1. 方案二:MySQL自带慢日志

可在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

# 开启MySQL慢日志查询开关
slow_query_log=1

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

慢日志文件中记录会记录sql执行时间超过设置时间的sql信息
localhost-slow.log。

  • 其中就包括了sql执行的耗时,以及记录sql语句

在这里插入图片描述


2、SQL语句执行很慢, 如何分析呢?

在这里插入图片描述采用MySQL自带的分析工具 EXPLAIN:

也就是在sql前面加上EXPLAIN

  • 通过key和key_len检查是否命中了索引(索引本身存在是否有失效的情况)
  • 通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描全盘扫描
  • 通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引修改返回字段来修复

3、了解过索引吗?(什么是索引)

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

4、索引的底层数据结构了解过嘛 ?

在这里插入图片描述

MySQL的InnoDB引擎采用的B+树的数据结构来存储索引

  1. 阶数更多,路径更短
  2. 磁盘读写代价B+树更低,非叶子节点只存储指针叶子阶段存储数据
  3. B+树便于扫库区间查询叶子节点是一个双向链表

5、什么是聚簇索引什么是非聚簇索引 ?

  • 聚簇索引:

聚簇索引(聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个

  • 非聚簇索引

非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个

在这里插入图片描述


6、知道什么是回表查询嘛 ?

要解释回表,就得解释一下聚簇索引和非聚簇索引。

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

在这里插入图片描述
也就是说通过二级索引查到的仅仅是主键的值,索引还要根据查到的主键通过聚簇索引去查询到整条数据的信息。


7、知道什么叫覆盖索引嘛 ?

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

也就是通过索引能直接查询到想要的数据,不需要回表。

例如下面的sql:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

8、MYSQL超大分页怎么处理 ?

可以使用覆盖索引+子查询解决

在这里插入图片描述


9、索引创建原则有哪些?

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


10、什么情况下索引会失效 ?(在联合索引的情况下)

在这里插入图片描述

假设该表使用了如下联合索引:
在这里插入图片描述
name, status, address

  1. 违反最左前缀法则
    在这里插入图片描述

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

在这里插入图片描述

  1. 不要在索引列上进行运算操作, 索引将失效
    在这里插入图片描述

  2. 字符串不加单引号,造成索引失效。(类型转换)
    在这里插入图片描述

  3. 以%开头的Like模糊查询,索引失效
    在这里插入图片描述


11、谈一谈你对sql的优化的经验

1. 表的设计优化

比如设置合适的数值(tinyint int bigint),要根据实际情况选择

比如设置合适的字符串类型(char和varchar)char定长效率高varchar可变长度,效率稍低

2. 索引优化
3. SQL语句优化

SELECT语句务必指明字段名称(避免直接使用select * ,也是为了能使用覆盖索引,用什么数据就查什么数据)

SQL语句要避免造成索引失效的写法

尽量用union all代替union union会多一次过滤,效率低(数据量多了,执行过滤操作耗时严重)

避免在where子句中对字段进行表达式操作(也就是怕索引失效)

Join优化 能用innerjoin 就不用left join right join,如必须使用 一定要以小表为驱动
内连接会对两个表进行优化,优先把小表放到外边,把大表放到里边。left join 或 right join,不会重新调整顺序

4. 主从复制、读写分离

  • 如果数据库的使用场景读的操作比较多的时候,为了避免写的操作所造成的性能影响 可以采用读写分离的架构。
  • 读写分离解决的是,数据库的写入,影响了查询的效率。

在这里插入图片描述

5. 分库分表

只在数据量非常大的情况才去做


二、事务

1、事务的特性是什么?可以详细说一下吗?

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。(不成功,便成仁)
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。(双方都是一致的状态)
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。(不受干扰)
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。(写进磁盘)

很好的例子就是转账操作在这里插入图片描述


2、并发事务带来哪些问题?怎么解决这些问题呢?MySQL的默认隔离级别是?

2.1. 并发事务问题

脏读:一个事务读到另外一个事务还没有提交的数据。
在这里插入图片描述
不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
在这里插入图片描述
幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了”幻影”。
在这里插入图片描述


2.2. MySQL的默认隔离级别

解决方案:对事务进行隔离
默认采用的隔离机制可重复读(不能解决幻读,但是相比其他的隔离机制,在性能和安全级别算是最优解了

在这里插入图片描述


3、undo log和redo log的区别

  1. redo log重做日志

记录的是事务提交时数据页的物理修改,是用来实现事务的持久性

该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中, 用于在刷新脏页到磁盘,发生错误时, 进行数据恢复使用。

在这里插入图片描述

  1. undo log 回滚日志

用于记录数据被修改前的信息 , 作用包含两个 : 提供回滚MVCC(多版本并发控制) 。undo log和redo log记录物理日志不一样,它是逻辑日志

可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,

update一条记录时,它记录一条对应相反的update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。

总之:

redo log: 记录的是数据页的物理变化服务宕机可用来同步数据
undo log :记录的是逻辑日志当事务回滚时,通过逆操作恢复原来的数据
redo log保证了事务的持久性,undo log保证了事务的原子性和一致性


4、事务中的隔离性是如何保证的呢?

:排他锁(如一个事务获取了一个数据行的排他锁其他事务就不能再获取该行的其他锁

mvcc : 多版本并发控制


5、解释一下MVCC

多版本并发控制。
维护一个数据的多个版本,使得读写操作没有冲突
MVCC的具体实现,主要依赖于数据库记录中的隐式字段undo log日志readView
在这里插入图片描述

  1. 隐藏字段:

trx_id(事务id),记录每一次操作的事务id,是自增的
roll_pointer(回滚指针),指向上一个版本的事务版本记录地址

在这里插入图片描述

  1. undo log:回滚日志,存储老版本数据

版本链:多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表

在这里插入图片描述

  1. readView:解决的是一个事务查询选择版本的问题

根据readView的匹配规则当前的一些事务id判断该访问那个版本的数据
不同的隔离级别快照读是不一样的,最终的访问的结果不一样
RC :每一次执行快照读时生成ReadView
RR:仅在事务中第一次执行快照读时生成ReadView,后续复用

在这里插入图片描述
参考链接:【MySQL】当前读和快照读
在这里插入图片描述

在这里插入图片描述

参考链接:正确的理解MySQL的MVCC及实现原理
MVCC的实现原理


6、MySQL主从同步原理

MySQL主从复制的核心就是二进制日志(BINLOG)

二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。
在这里插入图片描述
在这里插入图片描述
分成三步:

  1. Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。
  2. 从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log 。
  3. slave重做中继日志中的事件。从而达到主从同步的效果。

7、分库分表

- 什么时候需要分库分表?

1,项目业务数据逐渐增多,或业务发展比较迅速
2,优化解决不了性能问题(主从读写分离、查询索引…)
3,IO瓶颈(磁盘IO、网络IO)、CPU瓶颈(聚合查询、连接数太多)

分库分表的策略:
在这里插入图片描述
垂直分库:

核心:将业务不同的表拆分到不同的库中
在这里插入图片描述
垂直分表:

冷热数据分离,减少io争抢
在这里插入图片描述
水平分库:
在这里插入图片描述
水平分表:
在这里插入图片描述
分库的时候出现的问题
在这里插入图片描述
**加粗样式**

更新中---------
素材参考:黑马程序员

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

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

相关文章

go初识iris框架(三) - 路由功能处理方式

继了解get,post后 package mainimport "github.com/kataras/iris/v12"func main(){app : iris.New()//app.Handle(请求方式,url,请求方法)app.Handle("GET","/userinfo",func(ctx iris.Context){path : ctx.Path()app.Logger().Info(path) //获…

CEC2022:CEC2022测试函数及多种智能优化算法求解CEC2022对比

目录 一、CEC2022测试函数 二、多种智能优化算法求解CEC2022 2.1 本文参与求解CEC2022的智能优化算法 2.2 部分测试函数运行结果与收敛曲线 三、带标记收敛曲线代码(获得代码后可自行更改) 一、CEC2022测试函数 CEC2022测试集共有12个单目标测试函数&#x…

SpringBoot使用JKS或PKCS12证书实现https

SpringBoot使用JKS或PKCS12证书实现https 生成JKS类型的证书 可以利用jdk自带的keytool工具来生成证书文件, 默认生成的是JKS证书 cmd命令如下: 执行如下命令,并按提示填写证书内容,最后会生成server.keystore文件 keytool -genkey tomcat…

VMware Linux Centos 配置网络并设置为静态ip

在root用户下进行以下操作 1. 查看子网ip和网关 (1)进入虚拟网络编辑器 (2)进入NAT设置 (3)记录子网IP和子网掩码 2. 修改网络配置文件 (1)cd到网络配置文件路径下 [rootlo…

【element-ui】form表单初始化页面如何取消自动校验rules

问题描述:elementUI表单提交页面,初始化页面是获取接口数据,给form赋值,但是有时候这些会是空值情况,如果是空值,再给form表单赋值的话,页面初始化时候进行rules校验会不通过,此时前…

OpenMMLab MMDetectionV3.1.0-SAM(环境安装、模型测试、训练以及模型后处理工具)

OpenMMLab Playground 概况 当前通用目标检测的研究方向正在朝着大型多模态模型发展。除了图像输入之外,最近的研究成果还结合了文本模式来提高性能。添加文本模态后,通用检测算法的一些非常好的属性开始出现,例如: 可以利用大量…

在政策+市场双轮驱动下,深眸科技助力机器视觉行业走向成熟

近年来,随着人工智能发展的不断提速,机器视觉作为其重要的前沿分支,凭借着机器代替人眼来做测量和判断的能力,广泛应用于工业领域的制造生产环节,用来保证产品质量、控制生产流程、感知环境等,并迸发出强劲…

AI绘画| 迪士尼风格|可爱头像【附Midjourney提示词】

Midjourney案例分享 图片预览 迪士尼风格|可爱头像 高清原图及关键词Prompt已经放在文末网盘,需要的自取 在数字艺术的新时代,人工智能绘画已经迅速崭露头角。作为最先进的技术之一,AI绘画结合了艺术和科学,开启了一…

【工作】vant的search组件手动聚焦

背景 为了方便用户使用,第一次进来时默认输入框聚焦,但是当用户并没有输入手机号,点击按钮时,需要给一个友好提示,并且输入框重新聚集上。 过程 最开始以为search组件这个方法肯定已经实现了并且看官网文档上也有对…

redis的事务、redis持久化方案、Java操作redis数据库

五、redis的事务 开启事务: 要等左边的提交事务,右边才能拿到修改后的值 本来name不能增加,会报错,但是事务中没提交不知道错 此时提交数据: redis事务将成功的正常提交,失败的才回滚,所以不具备…

【计算机网络】11、网桥(bridge)、集线器(hub)、交换机(switch)、路由器(router)、网关(gateway)

文章目录 一、网桥(bridge)二、集线器(hub)三、交换机(switch)四、路由器(router)五、网关(gateway) 对于hub,一个包过来后,直接将包转发到其他口。 对于桥&…

边写代码边学习之卷积神经网络CNN

1. 卷积神经网络CNN 卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习神经网络的架构,主要用于图像识别、图像分类和计算机视觉等任务。它是由多层神经元组成的神经网络,其中包含卷积层、池化层和全连接…

HCIP——前期综合实验

前期综合实验 一、实验拓扑二、实验要求三、实验思路四、实验步骤1、配置接口IP地址2、交换机配置划分vlan10以及vlan203、总部分部,骨干网配置OSPF分部总部骨干网 4、配置BGP建立邻居关系总部骨干网分部 5、发布用户网段6、将下一跳改为本地7、允许AS重复8、重发布…

Java中集合容器详解:简单使用与案例分析

目录 一、概览 1.1 Collection 1. Set 2. List 3. Queue 1.2 Map 二、容器中的设计模式 迭代器模式 适配器模式 三、源码分析 ArrayList 1. 概览 2. 扩容 3. 删除元素 4. 序列化 5. Fail-Fast Vector 1. 同步 2. 扩容 3. 与 ArrayList 的比较 4. 替代方案…

C#——多线程之Thread

C#——多线程之Thread 前言一、Thread是什么?二、各应用场景以及实例分析1.前台线程和后台线程:2.异步处理3.线程状态及手动销毁线程4.线程同步/等待线程完成 总结 前言 上次简单讲述了关于多线程中Task的相关应用以及场景。今天我们来看一下多线程中Th…

【LeetCode】27. 移除元素

题目大概意思是剔除nums数组中出现的所有val值。可以用快慢双指针法来做。 快的指针在前面遍历找值不为val的元素的下标,慢的负责接收值不为val的元素,并及时更新数组。 class Solution {public int removeElement(int[] nums, int val) {//快慢指针法in…

单网卡实现 双IP 双网段(内外网)同时运行

前提是内外网是同一网线连接(双网线双网卡的具体可以自己搜索下。理论上都设置静态IP后把外网跃点设置小,内网跃点设置大,关闭自动跃点设置同一个接口跃点数,在通过命令提示符添加内网网址走内网网关就可以了)。 需要使…

华为OD机试真题 JavaScript 实现【机器人活动区域】【2023Q1 200分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、JavaScript算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试&am…

iOS--Runloop

Runloop概述 一般来说,一个线程一次只能执行一个任务,执行完成后线程就会退出。就比如之前学OC时使用的命令行程序,执行完程序就结束了。 而runloop目的就是使线程在执行完一次代码之后不会结束程序,而是使该线程处于一种休眠的状…

【iOS】GCD深入学习

关于GCD和队列的简单介绍请看:【iOS】GCD学习 本篇主要介绍GCD中的方法。 栅栏方法:dispatch_barrier_async 我们有时候需要异步执行两组操作,而且第一组操作执行完之后,才能开始执行第二组操作,当然操作组里也可以包含一个或者…