前言

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

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

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

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

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

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

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

MySQL是否在扫描额外的记录

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

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

重构查询的方法

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

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

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

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

切分查询

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

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

// chops a list into non-view sublists of length Lstatic <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!)

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

分解关联查询

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

优点有:

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

总结

更多相关文章

  1. Android(安卓)版本兼容 — Android(安卓)6.0 和 7.0后获取Mac地
  2. android 创建桌面快捷方式 、插件
  3. android源码下载方式
  4. 创建android逐帧动画的两种方式
  5. 【安卓笔记】android客户端与服务端交互的三种方式
  6. android触摸实现物体运动方式
  7. TabHost两种实现方式
  8. Android(安卓)RIL总体架构介绍
  9. Android-两种方式实现走马灯效果

随机推荐

  1. Android SeekBar
  2. Android SDK Manager 更新SDK问题
  3. mac 编译 Android 系统杂记
  4. Android设计中的.9.png
  5. textAppearance 解答,android系统主题样式
  6. Android 天气预报源码
  7. GridView示例2(自动增长)
  8. Android UI之RadioGroup
  9. Android ndk-stack tool
  10. Android调试笔记——Installation error