[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》