MySQL相关问题

简介: 当SQL语句执行缓慢时,可通过Skywalking等工具定位慢SQL,再使用Explain分析执行计划。重点关注possible_keys、key、key_len、type和extra字段,判断索引使用情况及是否回表。可通过优化索引、使用覆盖索引等方式提升性能。此外,还可开启MySQL慢日志或使用Arthas、Prometheus等工具辅助定位问题。

Q:如果一个SQL语句很慢,如何分析

先通过Skywalking开源工具定位到慢SQL,然后再通过在慢SQL语句前面加上关键字Explain,他可以获取MySQL执行SQL语句的信息,然后我们可以通过这些信息来分析原因

  • possible_keys:当前SQL可能会使用到的索引
  • key:当前SQL实际命中的索引
  • key_len:索引占用的大小
  • extra:额外的优化建议
  • Using where;Using Index:查找使用了索引,需要的数据都在索引列中,不需要回表查询
  • Using index condition:查找使用了索引,但是执行了回表查询
  • type:这条SQL语句的连接的类型,性能由好到差分别有
  • NULL、system:很少见基本用不上,NULL是没查询表,system是查询系统表
  • const:根据主键查询
  • eq_ref:根据主键索引查询或唯一索引查询------(查询出一条数据)
  • ref:索引查询------------------(很可能查询出多条数据)
  • range:范围查询
  • index:全索引查询
  • all:全表查询

通过Key和Key_len检查是否命中了索引(索引可能失效)

通过type字段查看sql是否有进一步优化的空间,是否存在全索引查询和全表查询

通过extra判断是否出现了回表查询,可以通过覆盖索引来修复


Q:在MySQL中如何定位慢查询

慢查询的原因
  • 聚合查询
  • 多表联查
  • 表数据量过大查询
  • 深度分页查询
如何定位慢查询
  • 方案一:开源工具
  • 调试工具:Arthas(阿尔萨斯)---可以使用命令的方式监控已经上线的项目,可以跟踪执行比较慢的方法,然后查看方法的执行时间,就可以确定哪里出了问题
  • 运维工具:Prometheus(破米修斯)、Skywalking(死盖窝King)---在监控中有指标的数据,可以实时查看接口的相应数据,排序按响应时间长短排序
  • 方案二:MySQL自带的慢日志查询
  • 慢日志查询记录了所有执行时间超过了指定参数(默认10秒)的所有SQL语句的日志,如果要开启慢日志查询,需要在MySQL的配置文件/etc/my.cnf中配置信息


#开启MySQL慢日志查询开关
slow_query_log=1
#设置慢日志的时间为2秒
log_query_time=2


Q:知道什么是覆盖索引吗?

覆盖索引呢主要是用于解决回表查询的一种手段,本意是让索引本身就包含查询所需的字段,这样他就不会进行回标,会直接返回数据。

覆盖索引的实现方式:

复合索引:将所需的多个字段在进行回标查询的时候,组合成一个新的字段,在执行查询时就能避免回表查询

优点

  1. 避免回表:直接通过索引返回结果,减少磁盘 I/O(尤其对随机 I/O 密集型查询)。
  2. 索引体积小:通常比全量数据小,缓存命中率更高。
  3. 减少锁争用:仅访问索引,减少对数据行的锁定。

缺点

  1. 空间开销:需额外存储字段,增加索引体积。
  2. 维护成本:插入 / 更新时需同时更新索引,写性能略有下降。
  3. 适用范围有限:仅适用于查询字段完全被索引覆盖的场景。

应用场景:

对频繁执行的查询(如报表统计)创建覆盖索引。

覆盖索引扫描代替全表扫描

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
Java 关系型数据库 中间件
分库分表(3)——ShardingJDBC实践
分库分表(3)——ShardingJDBC实践
1762 0
分库分表(3)——ShardingJDBC实践
|
网络协议 Windows
网络连接正常但百度网页打不开显示无法访问此网站解决方案
网络连接正常但百度网页打不开显示无法访问此网站解决方案
5120 0
网络连接正常但百度网页打不开显示无法访问此网站解决方案
|
消息中间件 缓存 监控
电商API接口功能全景图:商品、订单、支付、物流如何无缝衔接?
在数字化商业中,API已成为电商核心神经系统。本文详解商品、订单、支付与物流四大模块的API功能,探讨其如何协同构建高效电商闭环,并展望未来技术趋势。
|
10月前
|
存储 缓存 搜索推荐
电商系统云架构设计
本文深入解析支撑千万级电商业务的云架构设计,涵盖高并发处理、数据层优化、智能搜索与推荐、大促保障等核心环节。基于云原生与微服务理念,构建弹性、稳定、高效的技术体系,助力企业应对流量峰值与复杂业务挑战,实现规模化发展。
604 0
|
数据采集 缓存 监控
爬虫代理IP突然失效的应急处理指南
在爬虫开发中,代理IP是绕过反爬机制的重要工具,但其失效可能导致采集中断甚至IP封禁。本文结合实际场景,总结了代理IP失效时的应急处理方案,包括快速切换备用代理池、调整请求策略、启用本地缓存等,并提出了长期稳定策略,如IP质量监控、选择优质服务商、多协议支持与混合IP使用,帮助开发者构建高效稳定的爬虫系统。
392 0
|
存储 Java 大数据
Java代码优化:for、foreach、stream使用法则与性能比较
总结起来,for、foreach和stream各自都有其适用性和优势,在面对不同的情况时,有意识的选择更合适的工具,能帮助我们更好的解决问题。记住,没有哪个方法在所有情况下都是最优的,关键在于理解它们各自的特性和适用场景。
1087 23
|
SQL 存储 关系型数据库
|
SQL 索引
使用 explain 如何判断二级索引使用后是否回表?
如何使用 explain 判断二级索引使用后,是否存在回表操作?
691 0
|
Kubernetes 监控 Docker
[kubernetes]安装dashboard
[kubernetes]安装dashboard
1096 0
|
人工智能 机器人 Shell
【shell】shell数组的操作(定义、索引、长度、获取、删除、修改、拼接)
【shell】shell数组的操作(定义、索引、长度、获取、删除、修改、拼接)

热门文章

最新文章