在优化有问题的查询时,目标应该是找到一个更优的方法获得实际需要的结果,而不是一定总是要求从MySQL获取一模一样的结果集

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

设计查询的时候一定需要考虑的问题就是,是否需要将一个复杂的查询分成多个简单的查询。

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

但是这样的想法对于MySQL并不合适,因为MySQL从设计上就让连接和断开都很轻量,在返回一个小查询结果方面十分高效。

MySQL内部每秒能够扫描内存中上百万行的数据,相比之下,MySQL响应数据给客户端的速度就慢得多。在其他条件都相同的时候,使用尽可能少的查询当然是更好的。但是有时候,将一个大的查询分解为多个小查询是很有必要的。

切分查询

有时候需要对一个大查询分而治之,将大查询分为数个小查询,每个查询功能完全相同,只完成一小部分,每次只返回一小部分查询结果。

删除旧的数据就是一个很好的例子。定期清理大量数据时,如果使用一个大的语句一次性完成的话,可能需要锁住很多数据,占用很多数据并且会阻塞很多小的但是很重要的查询。

将一个大的DELETE语句切分成为多个较小的查询可以尽可能小的影响MySQL性能。

分解关联查询

很多高性能的应用都会第关联查询进行分解。简单地说,就是对每一个表进行一次单表查询,然后将结果在应用程序中进行关联。比如下面这个查询:

SELECT * FROM tag
JOIN tag_post ON tag_post.tag_id = tag.id
JOIN post ON tag_post.post_id = post.id

这个查询可以分解成下面这些查询来代替:

SELECT * FROM tag WHERE tag = 'mysql';
SELECT * FROM tag_post WHERE tag_id = 1234;
SELECT * FROM post WHERE post.id in (123,456,789);

这样拆分的好处是:

  1. 让缓存的效率更加高效。 许多应用程序可以方便地缓存单表查询对应的结果对象
  2. 减少查询时可能遇到的锁竞争
  3. 在应用层做关联,可以更容易对数据库进行拆分,做到高性能和可拓展
  4. 查询本身效率也可能随之提升。在这个例子中使用IN()代替关联查询,可以让MySQL按照ID顺序进行查询,这可能会比随机的关联更加高效
  5. 可以减少冗余记录的查询。在应用层进行关联查询,意味着对于某条记录应用只需要查询一次,而在数据库中进行关联查询,则可能需要重复的访问一部分数据。这样的重构有助于减少网络和内存的消耗。
  6. 在应用中实现了哈希关联,而不是使用MySQL的嵌套循环关联

让MySQL查询更加高效——对查询进行重构的更多相关文章

  1. 高性能MySQL笔记 第6章 查询性能优化

    6.1 为什么查询速度会慢   查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...

  2. 为什么MySQL不推荐使用子查询和join

    前言: 1.对于mysql,不推荐使用子查询和join是因为本身join的效率就是硬伤,一旦数据量很大效率就很难保证,强烈推荐分别根据索引单表取数据,然后在程序里面做join,merge数据. 2.子 ...

  3. MySQL数据库之单表查询中关键字的执行顺序

    目录 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 2 执行顺序 3 关键字使用语法 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from ...

  4. mysql学习 | LeetCode数据库简单查询练习

    力扣:https://leetcode-cn.com/ 力扣网数据库练习:https://leetcode-cn.com/problemset/database/ 文章目录 175. 组合两个表 题解 ...

  5. mysql的缓冲查询和非缓冲查询

    最近在开发一个PHP程序时遇到了下面的错误: PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 错误信息显示允许的 ...

  6. MySQL 5.5开启慢查询功能

    vim /etc/my.cnf [mysqld] slow-query-log = on # 开启慢查询功能 slow_query_log_file = /usr/local/mysql/data/s ...

  7. 提高MYSQL百万条数据的查询速度

    提高MYSQL百万条数据的查询速度 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 nul ...

  8. MySQL:动态开启慢查询日志(Slow Query Log)

    前言 在开发中,高效能的程序 也包括 高效能的查询,所以优化SQL也是程序员必要技能之一.要优化就必须要有慢日志记录才可以知道哪些查询慢,然后反向去修改 慢日志设置方式 写入文件 写入数据库 实践操作 ...

  9. Oracle、MySql、SQLServer数据分页查询

    看过此博文后Oracle.MySql.SQLServer 数据分页查询,在根据公司的RegionRes表格做出了 SQLserver的分页查询语句: 别名.字段 FROM( SELECT row_nu ...

随机推荐

  1. 使用Consul 实现 MagicOnion(GRpc) 服务注册和发现

    1.下载打开Consul 笔者是windows下面开发的(也可以使用Docker). 官网下载windows的Consul https://www.consul.io/ 使用cmd窗口打开,输入con ...

  2. JavaScript中+操作符的特殊性

    在JavaScript中+操作符有两个作用: (1)加法运算 (2)字符串连接 在使用+操作符进行运算时,当+操作符两边都是数值类型的时候,进行加法运算; 当+操作符两边有任意一边是字符串,则进行字符 ...

  3. Spring详解(七)------AOP 注解

    上一篇博客我们讲解了 AspectJ 框架如何实现 AOP,然后具体的实现方式我们是通过 xml 来进行配置的.xml 方式思路清晰,便于理解,但是书写过于麻烦.这篇博客我们将用 注解 的方式来进行 ...

  4. 比较empty()与 isset()d的区别

    比较empty()与 isset()的区别 注意:empty()在PHP5.5之前只能检测变量 isset()只能检测变量 两者之间的联系:empty($var) 等价于 !isset($var)|| ...

  5. 第13组_16通信3班_045_OSPFv3作业

    IPv6 路由-OSPFv3 实验目的   1. 掌握 OSPFv3 的配置方法 2. 掌握在帧中继环境下 OSPFv3 的配置方法 3. 掌握 OSPFv3 NSSA 的配置方法 4. 学会查看 O ...

  6. Spring中Model、ModelMap及ModelAndView之间的区别+传递参数

    org.springframework.ui.Model(接口)传递数据,Spring框架自动创建它的一个实现类,如BindingAwareModelMap org.springframework.u ...

  7. 短视频 SDK 6大功能技术实现方式详解

    第三方短视频解决方案作为快速切入短视频行业的首选方式,选择一款功能齐全.性能优异的短视频解决方案十分重要. 今天我们来谈谈短视频 SDK 6大重要功能点及其技术实现方式. 短视频拍摄 断点续拍 指在拍 ...

  8. Database Management System 基础01:管理自己的任何事

    前言 系列文章:[传送门] 这Database Management System 系列准备也慢慢的写出来了.Database Management是我学习的一块,这块出的也许比较慢.比较忙吧,坚持每 ...

  9. ④品茶看<Servlet&JSP>-EL表达式

    前言 今早,概率课偷了下小懒写的: 泡一杯红茶,ACM集训前,写篇博客记录记录EL表达式. #EL介绍 ①EL 语法 ②访问JavaBean等 ③EL隐式对象 ④EL运算符 EL介绍 EL 全名为Ex ...

  10. 1197多行事务要求更大的max_binlog_cache_size处理与优化

    1197多语句事务要求更大的max_binlog_cache_size报错   binlog_cache_size:为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存,提高记录bi ...