主题:如何重构查询冰战士何时需要使用这种技巧

(1)一种复杂查询还是多个简单查询

设计查询的时候需要考虑的一个重要问题是是否需要将一个复杂的查询分成多个简单的查询。在平时我们总是强调需要数据库完成尽可能多的工作,这样做的逻辑在于以前总是认为通络通信,查询解析以及优化师一种代价很高的事情。但是MySQL在设计上让连接和断开连接都很轻量级,在返回一个小的查询结果方面很高效。线代的网络速度比以前要快很多,无论是带宽还是延迟。

MySQL内部内部每秒能够扫描内存中上百万行的数据,相比之下MySQL响应数据给客户端就要慢很多了。在其他条件相同的时候,使用尽可能少的查询当然是更好的。但是,将一个大查询分解成小查询是很有必要的。不过再应用设计的时候,如果一个查询能够胜任时还写成多个小查询那就是傻逼

(2)切分查询

有时候对于一个大查询我们就要将大查询切分成小查询,每个查询功能完全一样,但是只完成一小部分,每次返回一小部分查询结果。

删除旧数据就是一个很好的例子。定期的清除大量数据时,如果用一个大语句一次性完成的话,则可能需要一次锁住很多的数据,占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询。将一个大的DELETE语句切分成多个较小的查询尽可能小的影响MySQL性能,同时还减少MySQL复制到延迟。同时,需要注意的是,如果每次删除数据后,都暂停一会儿再做下一次杀出,这样也可以将服务器上原本一次性的压力分散到一个很长的时间段中,就可以大大的降低对服务器的影响,还可以大大减少删除时锁的持有时间

(3)分解关联查询

简单的关联查询分解就是可以对每个表进行一次单表查询,然后将结果在应用程序中进行关联。例如:

select * fromtag

join tag_post ON tag_post.tag_id=tag.id

join post ON tag_post_id=post.idwhere tag.tag='mysql'

可以分解成

select * from tag where tag='mysql'

select * from tag_post where tag_id=1234

select * from post where post.id in (123,456,567,9098,8904)

乍一看,这样做并没有什么好处,原本一条查询,这里却变成多条查询,返回的结果又是一模一样。事实上,用分解关联查询重构查询有如下的优点:

①让缓存的效率更高。②将查询费恩节后,执行单个查询可以减少锁竞争。③在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可拓展。④查询本身效率也可能有所提升。⑤可以减少冗余记录的查询。⑥更进一步,这样做相当于在应用中实现了哈希关联,而不是使用MySQL的嵌套循环关联

在很多情况下,通过重构查询将关联放到应用程序中将会更加高效,这样的场景有很多。比如:当应用能够方便的缓存单个查询的 结果的时候、当可以将数据分布到不同的MySQL服务器上的时候、当能够使用IN代替关联查询的时候。

mysql 重构同步老数据_MySQL 重构查询的方式相关推荐

  1. 如何查mysql里有多少条数据_mysql快速查询数据库中有多少条数据

    慕尼黑的夜晚无繁华 mysql 统计 表的数量:SELECT COUNT(1) FROM information_schema.TABLES WHERE TABLE_SCHEMA = '你的数据库'; ...

  2. mysql主从同步部分表_Mysql入门MySQL 主从同步部分数据表

    <Mysql入门MySQL 主从同步部分数据表>要点: 本文介绍了Mysql入门MySQL 主从同步部分数据表,希望对您有用.如果有疑问,可以联系我们. 导读:在配置MySQL主从同步的时 ...

  3. mysql如何更新两条数据_mysql根据查询结果批量更新多条数据(插入或更新)

    mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...

  4. mysql主从同步当天数据,mysql主从数据同步

    一,安装好主数据库和从数据库,此处省略 我已经准备好了以下数据库 主: centos 7 mysql 5.7 ip 192.168.1.2 从: centos 7 mysql 5.7 ip 192.1 ...

  5. mysql定时清空表数据_Mysql实现定时清空一张表的旧数据并保留几条数据

    要达到如下目的: Mysql数据库会每隔一段时间(可以是2小时,也可以是一天,这个可以自定义),定时对一张库中的表做一个判断,如果这张表的数据超过了20条(这个数据也是自定义的,也可以是200条),就 ...

  6. mysql修改级联表数据_MySQL数据库 外键,级联, 修改表的操作

    1.外键: 用来建立两张表之间的关系 - 一对多 - 多对多 - 一对一 研究表与表之间的关系: 1.定义一张 员工部门表 id, name, gender, dep_name, dep_desc - ...

  7. php mysql数据库同步_实现MySQL数据库同步实例演示_MySQL

    本次实验的主要目的是剖析配置MySQL(和PHP搭配之最佳组合) 数据库的主辅MySQL数据库同步的实际操作步骤,我前两天在相关网站看见的资料,觉得挺好,就拿出来供大家分享,开始具体的配置. 本次试验 ...

  8. mysql删除表单挑数据_MySQL 删除数据表

    MySQL 删除数据表 MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失. 语法 以下为删除MySQL数据表的通用语法: DROP TA ...

  9. php mysql 插入多条数据_mysql如何插入多条数据?

    mysql插入多条数据的方法:1.使用"INSERT INTO 表名 字段列表 VALUES (值1) - , (值n);"语句插入数据:2.使用"INSERT INTO ...

最新文章

  1. 程序媛眼中的程序猿原来是这样子的!
  2. TextRNN用于文本分类
  3. 那些年追过的......写过的技术博客
  4. 【干货分享】云服务平台的架构及优势(上)
  5. 根据当前时间如何找到上月的第一天和最后一天?
  6. 微软Build 2019大会.NET课程视频汇总
  7. java冒泡排序_冒泡排序不会写,怎么当程序员?细说经典java算法——冒泡排序...
  8. antd权限管理_推荐6款超好看实用的管理后台模版
  9. dbeaver默认值怎么设置_电脑没声音怎么办,峰哥教你如何解决
  10. jsp之servlet模板问题
  11. vivado和modelsim联合仿真实现占空比1:15的分频
  12. 四川专利代理机构列表
  13. 身体出现十个信号当心短命
  14. wireshark ip地址抓包
  15. 计算机应用软件开机自动启动设置,如何关闭开机自动启动的软件?
  16. 成功解决 XXX--1.0-SNAPSHOT.jar中没有主清单属性
  17. 八十年代的古董级晶体管直流稳压电源 WYJ-15V/1A
  18. 斐讯 http文件服务器,斐讯刷机教程(硬件版本A5)
  19. 移动端车牌识别要做到那一步?
  20. 【引人深思】程序员锁死服务器致公司倒闭

热门文章

  1. hdu3613(扩展KMP)
  2. Axure--Web原型开发工具
  3. 通过修改注册表实现Windows 隐藏账户
  4. Python逻辑运算符:if and
  5. 性能之巅:Linux网络性能分析工具-netstat,ifconfig,nicstat,traceroute,tcpdump
  6. Flask-模板渲染
  7. 论文笔记:ZFNet
  8. 一个封锁操作被对 wsacancelblockingcall 的调用中断_操作系统概论
  9. spring cloud架构 - HongHu common-service 项目构建过程
  10. 循环获取枚举值和名称