当前位置: 首页 > article >正文

[MySQL]3-MySQL查询性能优化

目录

🌟慢查询基础:优化数据访问

不必要的数据

MySQL扫描额外的记录

访问类型

重构查询的方式

切分查询(分治)

分解联接查询

特定类型查询优化

优化count查询

使用近似值

覆盖索引

优化LIMIT和OFFSET

使用覆盖索引的联查

记录分页查询节点

优化UNION查询

资料引用



索引优化、查询性能优化、库表结构优化需要齐头并进。三管齐下:不做、少做、快速地做。

🌟慢查询基础:优化数据访问

可以通过减少要筛选的数据量进行优化。大部分性能低下的查询都可以通过减少访问的数据量的方式进行优化。

1、确认是否检索了大量不必要的数据,是否访问了太多行或者列

2、确认MySQL服务器层是否在分析大量不必要的数据行

不必要的数据

不需要的数据会带来额外的网络开销、内存占用、CPU资源占用。

只查询需要的列,行。

多次查询相同的数据,使用缓存。

MySQL扫描额外的记录

衡量性能开销的指标:响应时间、扫描行数、返回行数

响应时间=服务时间+排队时间

理想情况在扫描的行数和返回的行数是相同的。

比如LIMIT OFFSET就经常会扫描到用不到的行。

访问类型

在分析执行计划是,对于访问类型type列,不需要记住访问类型,但是需要明白扫描表、扫描索引、范围访问和单值访问的概念。

重构查询的方式

MySQL从设计上让连接和断开连接都很轻量。因此,有时候将一个大查询分解为小查询是很有必要的。

切分查询(分治)

当大查询语句可能会长时间锁住很多数据、阻塞其他查询的时候,可以将其拆分为多个对MySQL影响小的语句。

分解联接查询

联接查询可以对联接的每个表进行单表查询,然后在应用程序中进行联接。

特定类型查询优化

优化count查询

count()函数在统计列值时要求列值非空,即不统计NULL。

count(*)并不会统计所有列,而是忽略所有列直接统计所有的行数。

统计不同值时,可以使用如下语句:

SELECT COUNT(cloumn = 'value1' OR NULL) AS name_a, COUNT(cloumn = 'value2' OR NULL) AS name_b FROM table;

使用近似值

某些业务场景并不要求精确统计,使用近似值代替比复杂统计查询快的多。

覆盖索引

在优化SQL后,MySQL层面还做的只有覆盖索引了。

优化LIMIT和OFFSET

LIMIT做分页查询的时候,需要优化大偏移量的性能,也就是深度分页性能。

主要是MySQL扫描了大量不需要的行的性能问题。

使用覆盖索引的联查

记录分页查询节点

where id >100000 之类的

优化UNION查询

使用union合并查询结果时,union会去重,union all不会去重。

如非必要,使用uniall all,对于重复数据在应用层处理

资料引用

《高性能MySQL》


http://www.kler.cn/a/544097.html

相关文章:

  • TDengine 产品由哪些组件构成
  • 【vs2022配置cursor】
  • Java进阶14 TCP日志枚举
  • chrome-mojo C++ Bindings API
  • Hello Robot 推出Stretch 3移动操作机器人,赋能研究与商业应用
  • 【苍穹外卖】修改前端代码解决修改Nginx端口后websocket连接失败的问题
  • 浏览器自动化与AI Agent结合项目browser-use初探
  • redis 缓存击穿问题与解决方案
  • 数据守护:备份文件的重要性及自动化备份实践指南
  • GPT-SWARM和AgentVerse的拓扑结构和交互机制
  • Java面试——Tomcat
  • w~大模型~合集30
  • pdf.js默认显示侧边栏和默认手形工具
  • 【c++】四种类型转换形式
  • OpenWRT中常说的LuCI是什么——LuCI介绍(一)
  • 团结引擎高性能ECS架构(下)
  • 城电科技|海岛为什么要用智能光伏太阳花
  • Python练习11-20
  • 【机器学习】数学知识:拉格朗日对偶(Lagrange Duality)
  • Java面试突击
  • pytorch环境已安装库汇总
  • 【蓝桥杯】大纲
  • 纪念日倒数日项目的实现-【纪念时刻-时光集】
  • Ansible的语法
  • 微服务保护---Sentinel
  • javascript中数组的常见的简便写法,javascript中map, filter, forEach, reduce 等方法组合使用