MySQL慢查询以及重构查询的方式记录

MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句,这篇文章主要给大家介绍了关于MySQL慢查询以及重构查询的相关资料,需要的朋友可以参考下

前言

什么是慢查询,如何优化慢查询,下面介绍这两个知识点的相关知识。

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

是否向数据库请求了不需要的数据

查询不需要的记录:解决方案:查询后面加上Limit

多表关联时返回全部列:解决方案:只取需要的列

总是取出全部列:select * 解决方案:最好还是获取部分列,除非应用程序处缓存列的数据了

重复查询相同的数据:解决方案:需要时从缓存中取出

MySQL是否在扫描额外的记录

可以从响应时间,扫描的行数,返回的行数来进行查询开销的衡量。

要想减少扫描行数可以使用索引对需要的记录进行覆盖,但是增加索引不意味着就能让扫描的行数等于返回的行数,比如sum,count之类的聚合函数

重构查询的方法

一个复杂查询还是多个简单查询

在过去,总是强调需要数据库层完成尽可能多的工作,因为过去网络通信查询解析和优化是一件代价很高的事情。

但是这样的想法对于MySQL并不适用,MySQL从设计上让连接和断开连接都很轻量级,在返回一个小的查询结果方面很高效。现代的网络速度比以前要快很多,无论是带宽还是延迟。在某些版本的MySQL上,即使在一个通用服务器上,也能够运行每秒超过10万的查询,即使是一个千兆网卡也能轻松满足每秒超过2000次的查询。所以运行多个小查询现在已经不是大问题了。

当然,相比较于内部扫描,响应数据给客户端更加耗时,所以在同条件下,使用尽可能少的查询更好。

切分查询

当使用sql进行查询时,需要注意将大查询切分成小查询,可以减少对数据库的影响,因为一个大语句一次性完成的话,则可能一次锁住很多数据,占满整个事务日志,耗尽系统资源,阻塞其他查询。

比如我们做数据统计时要对大量订单号的信息进行查询,那么是一次性用in查询,还是切割参数list多次查询呢,答案是切割参数list多次查询,因为当in里面的参数过多时,MySQL就会认为再走索引已经不行了,可能就会进行全表查询,如果这个时候数据表数据量过大,那可能就会造成查询超时。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

// chops a list into non-view sublists of length L

static <T> List<List<T>> chopped(List<T> list, final int L) {

List<List<T>> parts = new ArrayList<List<T>>();

final int N = list.size();

for (int i = 0; i < N; i += L) {

parts.add(new ArrayList<T>(

list.subList(i, Math.min(N, i + L)))

);

}

return parts;

}

List<Integer> numbers = Collections.unmodifiableList(

Arrays.asList(5,3,1,2,9,5,0,7)

);

List<List<Integer>> parts = chopped(numbers, 3);

System.out.println(parts); // prints "[[5, 3, 1], [2, 9, 5], [0, 7]]"

parts.get(0).add(-1);

System.out.println(parts); // prints "[[5, 3, 1, -1], [2, 9, 5], [0, 7]]"

System.out.println(numbers); // prints "[5, 3, 1, 2, 9, 5, 0, 7]" (unmodified!)

在程序中将list截断,从而使查询能使用索引而不是进行全表扫描。

阿里开发手册中就推荐仔细评估in后面的集合元素数量,控制在1000个之内。

分解关联查询

将多表inner join 进行分解,分解成小查询,超过三个表的join,就需要禁止了。

优点有:

  • 缓存的效率会更高,
  • 分解后的查询可以减少锁的竞争
  • 应用层可以缓存查询数据,减小数据库的压力。
  • 可以提升查询效率,因为用主键之类进行in查询,比按照条件范围查询可能会更高效,尤其是大表的时候。
  • 可以减少冗余记录的查询
  • 更进一步,这样做相当于在应用中实现了哈希关联,而不是使用MySQL的嵌套循环关联。某些场景哈希关联的效率要高很多。
  • 总结

    到此这篇关于MySQL慢查询以及重构查询的文章就介绍到这了,更多相关MySQL慢查询重构查询内容请搜索钦钦技术栈以前的文章或继续浏览下面的相关文章希望大家以后多多支持钦钦技术栈!

    原文链接:https://juejin.cn/post/6973967369483845639

    版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/6971/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

    (0)
    上一篇 2022-07-31 3:29:50
    下一篇 2022-07-31 3:30:03

    软件定制开发公司

    相关阅读

    发表回复

    登录后才能评论
    通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!