优化Mysql
目录
Mysql优化就四种:定位慢查询/sql执行计划/索引/Sql优化经验... 2
1Mysql如何定位慢查询?... 2
2Sql语句执行很慢,如何分析呢?... 3
2.1那这个SQL语句执行很慢,如何分析呢?. 3
3.了解过索引吗?(什么是索引) 3
3.1什么是聚簇索引,什么是非聚簇索引?什么是回表查询?... 3
3.1.1聚集索引选取规则... 4
3.1.2回表查询... 4
4什么是覆盖索引... 5
4.1超大分页处理?... 5
5索引创建原则有哪些?... 6
6什么情况下索引会失效?... 6
7谈谈你对sql优化的经验... 7
7.1表的设计优化、避免索引失效、sql语句优化等... 7
8事务的特性... 9
9并发事务的问题,隔离级别... 9
9.1解决方案,对事务进行隔离... 9
10undo log和redo log的区别?... 11
11解释一下mvcc?... 12
12.mysql主从原理?... 13
13项目中用过分库分表吗?. 14
13.1垂直分库和分表... 14
13.2水平分库... 14
Mysql优化就四种:定位慢查询/sql执行计划/索引/Sql优化经验
1Mysql如何定位慢查询?
基本就是页面加载慢,接口的响应测试时间长。
怎么确定是mysql的问题呢,如果是sql问题,怎么找出慢的原因呢。
方案一:开源工具:监听调试。调试工具arthas。运维工具:普罗米修斯,skywalking
方案一主要就是哪些接口慢,sql时间长给监控排序罗列出来。
方案二:慢日志查询。
慢查询日志开启slow-query-log=1
慢日志时间为2long-query-time=2
Sql超过两秒则记录/一般调试的时候才开启,生产的时候不开启不然会损坏mysql性能
1.介绍一下当时产生问题的场景(我们当时的一个接口测试的时候非常的慢,压测的结果大概5秒钟)
2.我们系统中当时采用了运维工具(Skywalking),可以监测出哪个接口,最终因为是sql的问题
3.在mysql中开启了慢日志查询,我们设置的值就是2秒,一旦sql执行超过2秒就会记录到日志中(调试阶段)
2Sql语句执行很慢,如何分析呢?
Explain和desc就可以分析sql语句了
字段名词解释:
possible key 当前sql可能会使用到的索引
key 当前sql实际命中的索引
key len 索引占用的大小
extra额外的优化建议
type 这条sql的连接的类型,性能由好到差为NULL、system、const、eq ref、ref、range、index、all
2.1那这个SQL语句执行很慢,如何分析呢?
可以采用MySQL自带的分析工具 EXPLAIN
通过key和key len检查晟否命中了索引(索引本身存在是否有失效的情况)
通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描
通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复
3.了解过索引吗?(什么是索引)
索引(index)是帮助MySQI高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法这种数据结构就是索引。
3.1什么是聚簇索引,什么是非聚簇索引?什么是回表查询?
个人理解,聚簇全是主键,然后拿行数据。只有一行
非聚簇就是通过某个数据字段找这个主键,可能会有多个。
聚簇索引也就是聚集索引。
二级索引也就是非聚集索引。
什么是聚集索引,什么是二级索引(非聚集索引)什么是回表?
聚集索引(Clustered Index)将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据必须有,而且只有一个,个人理解只对应一行数据
二级索引(Secondary Index)将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键可以存在多个,叶子节点存储对应的主键值。
3.1.1聚集索引选取规则
如果存在主键,主键索引就是聚集索引。
如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。
3.1.2回表查询
大多数的数据都用的非聚簇索引。
回表查询就是通过二级索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表
4什么是覆盖索引
个人理解,不用回表查询的查询语句,比如局促和非聚簇都可以的。
4.1超大分页处理?
覆盖索引+子查询
比如分页查询需要九百万limit仅仅需要十条怎么才能快?
正常直接limit获取*你这样拿所有行数据很慢。
但你如果先拿到id,再通过id来查询就非常快,省去了九百万的时间代价。
5索引创建原则有哪些?
先陈述自己在工作中用到的,主键索引,唯一索引,根据业务创建的复合索引
单表超过十万条数据,可以建立索引。
3尽量不要好几条数据都是北京市,这种字段不适合索引
4尽量字段短一些,太长的可以截取一部分,建立前缀索引。
5尽量使用联合索引或者叫做复合索引。
总结重点:数据量大;查询频繁;排序,分组,查询条件的字段;尽量联合索引,避免回表;控制数量。
6什么情况下索引会失效?
命中索引就是查询的时候使用到了索引。
1.复合索引。不能跳过某一列去查询,可能会失效。违反最左前缀法则,索引失效。
2.范围查询,>1后面的索引是失效的。这叫范围查询最右边的列,不能使用索引。
3.不要在索引列上运算,不然会失效
4.类型转换,比如明明是字符串,您不加单引号,那也索引失效。
5.%开头的模糊查询也会失效,放在末尾%不会影响索引
7谈谈你对sql优化的经验
7.1表的设计优化、避免索引失效、sql语句优化等
参考阿里开发手册嵩山版本
- 类型选择,tinyint或者char是固定类型但性能好。
- 索引创建原则,查询的时候避免索引失效
8事务的特性
ACID分别就是原子性,隔离性,一致性,隔离性,持久性。
9并发事务的问题,隔离级别
- 脏读就是,读的是错误的修改后还没提交的数据。
- 不能读两次,又是事务前,又是事务后。
9.1解决方案,对事务进行隔离
打叉就是解决的问题。
10undo log和redo log的区别?
缓冲池和数据页。Sql操作肯定先去内存的缓冲池找数据操作,如果找不到就再去磁盘。然而操作缓冲池以后,要将数据同步到磁盘中,没有同步过去的称为脏页。一旦服务器宕机,内存中的数据会丢失。于是就引进了redo log
关于mysql的事务提交,增删改数据,为了提高性能。引入了两块区域,一个是内存结构,一个是磁盘结构。
磁盘的结构主要是存储的数据页,比如说某一个表的ibd文件里边包含了很多数据页。每个页中存储的就是sql一行行的数据。
增删改首先会操作内存。内存的概念就是缓冲池。数据库先操作内存,如果没有数据才考虑磁盘,操作完内存会将数据同步到磁盘中。
主要是用来实现事务的持久性的。
Redo log 由两部分组成,redo log buffer(内存)和redo log file (磁盘)
内存中有buffer pool和redo log buffer,当增删改buffer pool的时候redo log buffer就记录数据的变化。一旦发生变化,redo log buffer记录数据页的变化,就会把这些数据记录到磁盘文件中,也就是redo log file日志文件中。
所以一旦从内存同步数据到磁盘失败的话,就会从redo log file日志文件中恢复数据
这个过程遵循WAL机制,write-ahead-logging就是先写日志redo log,所以当脏页正常写到磁盘中的时候,日志就没用了。这个日志文件在磁盘中是两份,循环写。
Undo log记录相反日志,可以实现事务的一致性和原子性。
11解释一下mvcc?
个人理解大概实现了隔离性。
12.mysql主从原理?
主库会把ddl(create-drop)和dml(增删改)写进binlog二进制文件,
从库会有一个io thread线程来读取这个二进制日志文件,
然后写进从库的一个中继文件relay log中,
再由中继文件通过sql thread线程同步到从库的数据库中。
13项目中用过分库分表吗?
单表数据量达到一千万,或者20G以后。就要分库分表了
13.1垂直分库和分表
个人理解:垂直分库,就是根据业务不同的表放在不同的库中。
用户微服务,商品微服务,订单微服务。
比如基本信息,详细信息,只有感兴趣,点进去才会展示。
对比垂直分表,个人理解,不同的字段拆成不同的表中。
热数据冷数据。
特点:
1,冷热数据分离2,减少IO过渡争抢,两表互不影响
13.2水平分库
每个库存储的数据是不一样的,但是类型是一样的。所有库的数据加起来才是这个业务的所有数据。
但是,你想要拿数据,该怎么选择库呢,就对id进行一个分库,可以路由规则
水平分库用的更多一些,海量数据一般都水平分库。
高并发提高磁盘io性能一般垂直分库
垂直分表,冷热数据分离/
相关文章:

优化Mysql
目录 Mysql优化就四种:定位慢查询/sql执行计划/索引/Sql优化经验... 2 1Mysql如何定位慢查询?... 2 2Sql语句执行很慢,如何分析呢?... 3 2.1那这个SQL语句执行很慢,如何分析呢?. 3 3.了解过索引吗?(什么是索引)…...

如何使用MethodChannel通信
文章目录 1 概念介绍2 实现方法3 经验总结我们在上一章回中介绍了Visibility组件相关的内容,本章回中将介绍Flutter与原生平台通信相关的内容.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 在移动开发领域以Android和IOS SDK开发出的应用程序叫原生开发,开发同一个程序…...
【JavaWeb】JavaWeb笔记 HTTP
文章目录 简介HTTP1.0和HTTP1.1的区别 请求和响应报文报文的格式请求报文form表单发送GET请求特点GET请求行,请求头,请求体form表单发送post请求特点post的请求行 请求头 请求体 响应报文响应状态码更多的响应状态码 简介 HTTP 超文本传输协议 (HTTP-Hyper Text transfer proto…...

Java项目实战II基于Java+Spring Boot+MySQL的甘肃非物质文化网站设计与实现(源码+数据库+文档)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 甘肃省作为中国历史文化名省,拥有丰富的非物质文化遗产资源,涵盖表演艺术、手…...

数据结构--包装类简单认识泛型
目录 1 包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱,自动装箱和自动拆箱 2 什么是泛型 3 引出泛型 3.1 语法 4 泛型类的使用 4.1 语法 4.2 示例 5 泛型的上界 5.1 语法 5.2 示例 5.3 复杂示例 8 泛型方法 8.1 定义语法 8.2 示例 总结 1 …...

c#使用winscp库实现FTP/SFTP/SCP的获取列表、上传和下载功能
网上写c#调用winscp实现的资料很少,且写的不够详细。本人查了下winscp的libraries说明,写了个小工具,供大家参考。 winscp的接口说明地址如下: WinSCP .NET Assembly and COM Library :: WinSCP 一、先展示一下小工具的界面 1、…...

【Android 13源码分析】Activity生命周期之onCreate,onStart,onResume-1
忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。 – 服装…...

达梦数据库开启归档模式
目录 一、什么是归档模式? 二、开启归档模式的步骤 1、创建归档目录 2、进入dm数据库bin目录 3、登录数据库 4、关闭数据库 5、启动数据库到Mount状态 6、增加本地归档日志文件 7、开启归档 8、启动数据库 9、验证是否开启成功 三、开启归档模式的优…...
C++ 语言特性07 - 静态成员的初始化
一:概述 1. 静态成员变量通常在类定义内部声明,并在类定义外部定义和初始化。 class MyClass { public:static int staticVar; // 声明 };int MyClass::staticVar 42; // 定义和初始化 2. 从C11开始,可以在类内直接初始化静态数据成员&am…...

【数据结构】图论基础
文章目录 图的概念图的基本概念图的类型图的表示方法 图的相关基本概念1. 路径(Path)2. 连通性(Connectivity)3. 图的度(Degree)4. 子图(Subgraph)5. 生成树(Spanning Tr…...

HTML5实现好看的唐朝服饰网站模板源码2
文章目录 1.设计来源1.1 网站首页1.2 唐装演变1.3 唐装配色1.4 唐装花纹1.5 唐装文化 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.ne…...

golang web笔记-2.请求request
什么是request http消息分为request(请求) 和 response(响应) request:在go中是一个struct,代表了客户段发送的http请求,已可以通过request 的方法访问请求中的cookie、URL、User Agent…...
docker的安装与启动——配置国内Docker源
移除旧版本docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 配置docker yum源。 sudo yum install -y yum-utils sudo yum-config-manager –add-repo ht…...

httpsok-v1.17.0-SSL通配符证书自动续签
🔥httpsok-v1.17.0-SSL通配符证书自动续签 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具,基于全新的设计理念,专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分钟轻…...
相机、镜头参数详解以及相关计算公式
一、工业相机参数 1、分辨率 相机每次采集图像的像素点数,也是指这个相机总共有多少个感光晶片。在采集图像时,相机的分辨率对检测精度有很大的影响,在对同样打的视场成像时,分辨率越高,对细节的展示越明显。 相机像素…...

【微服务】组件、基础工程构建(day2)
组件 服务注册和发现 微服务模块中,一般是以集群的方式进行部署的,如果我们调用的时候以硬编码的方式,那么当服务出现问题、服务扩缩容等就需要对代码进行修改,这是非常不好的。所以微服务模块中就出现了服务注册和发现组件&…...

ESP32微信小程序SmartConfig配网
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ESP32&微信小程序SmartConfig配网 前言一、SmartConfig是什么?二、使用乐鑫官方的smart_config例子1.运行照片 三、微信小程序总结 前言 本人是酷爱ESP32S3这…...
【PostgreSQL】提高篇——深入了解不同类型的 JOIN(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN)应用操作
1. JOIN 的基础概念 在 SQL 中,JOIN 是用于从两个或多个表中组合行的操作。JOIN 允许我们根据某些条件将表中的数据关联在一起。常见的 JOIN 类型包括: INNER JOIN:仅返回两个表中满足连接条件的行。LEFT JOIN(或 LEFT OUTER JO…...

师生健康信息管理:SpringBoot技术突破
第4章 系统设计 4.1 系统体系结构 师生健康信息管理系统的结构图4-1所示: 图4-1 系统结构 登录系统结构图,如图4-2所示: 图4-2 登录结构图 师生健康信息管理系统结构图,如图4-3所示。 图4-3 师生健康信息管理系统结构图 4.2…...

【完-网络安全】Windows注册表
文章目录 注册表启动项及常见作用五个根节点常见入侵方式 注册表 注册表在windows系统的配置和控制方面扮演了一个非常关键的角色,它既是系统全局设置的存储仓库,也是每个用户的设置信息的存储仓库。 启动项及常见作用 快捷键 WinR打开运行窗口&#x…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...

图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...

C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...