我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL怎么重写查询语句

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL怎么重写查询语句

这篇文章主要介绍MySQL怎么重写查询语句,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

在优化存在问题的查询时,我们需要改变方式去获取查询结果——但这并不意味着从 MySQL获取同样的结果集。有些时候我们可以将查询转换为获取相同结果,但更好性能的查询形式。然而,我们也需要考虑重写查询去获取不同的结果,因为这样可以提高开发效率。也可以通过修改应用程序代码来取得相同的效果。本篇文章将介绍如何重写查询的技巧。

复杂查询与分步查询

一个重要的查询设计课题是将复杂查询分解为多个简单查询是否会更好。在传统的数据库设计中强调尽可能地用更少的查询解决大量工作。在过往,这种方式会更好。这是因为以前的网络通讯成本更高以及考虑查询解析器和优化器的负荷。

然而,这种建议并不怎么适用于 MySQL,这是由于 MySQL 处理建立连接和断开连接的方式十分高效,并且对简单查询的响应很快。当今的网络速度相比以前也有了大幅度的提升。根据不同的服务端版本,MySQL 可以在普通机器上一秒内运行超过10万次的简单查询,并且在千兆网络上完成每秒2000次的查询通讯。因此,进行分布查询并不是过往说的那么糟糕。

相比于每秒遍历的数据行数,连接响应依旧是比较慢的。在内存数据中,这个时间达到了毫秒级。当然,使用尽可能的查询次数依旧是一个不错的选择。但是,有时我们可以通过拆分复杂查询为几个简单的查询来提高性能。接下来我们将展示一些示例。

在程序设计中,使用过多的查询是一个常犯的错误。例如,有些应用执行了10个单独的查询来获取10行数据(使用循环一条条获取),而这本可以通过一条查询10行数据的查询来完成。因此,这并不是倡导每次都做查询的拆分,而是根据实际情况来。

切分查询语句

另一个方式是拆分查询后重新再组合。通过在大数据量的查询拆分为更小范围的查询以减少每次影响的行数。

清洗旧数据就是一个典型的例子。周期性的清洗数据工作需要移除大量数据,进行这样的操作会长时间锁定大量数据行。这种操作还会产生事务日志、消耗大量资源并且会阻塞那些本不应该被打断的小数据量的查询。将DELETE语句切分后,使用中等规模的查询可以显著改善性能,并且在查询是重复的时候可以减少重复查询产生的额外延迟。例如下面的删除语句:

DELETE FROM messages WHERE created < DATE_SUB(NOW(), INTERVAL 3 MONTH);

应用的伪代码的形式如下:

rows_affected = 0do {  rows_affected = do_query (  "DELETE FROM messages WHERE created < DATE_SUB(NOW(), INTERVAL 3 MONTH)  LIMIT 10000")  } while rows_affected > 0

一次删除10000行对于提高每次查询的效率来说已经是一个足够大的任务了。一个足够短的任务会减少对服务端的影响(事务存储引擎会从中受益)。在 DELETE 语句中插入一些休眠时间也是一个不错的主意,这样可以在时间上分散负荷并且缩短持有锁的持续时间。

拆解联合查询

很多高性能的应用会拆解联合查询。可以通过将联合查询拆分为多个单表查询,然后在应用中再将结果组合起来。例如:

SELECT * FROM tagJOIN tag_post ON tag_post.tag_id=tag.id  JOIN post ON tag_post.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);

注:这里的 tag_id=1234和post.id IN (123, 456, 567, 9098, 8904)都是基于前面查询的结果得到的值。为什么要这么做?第一眼看过去好像是毫无必要的——增加了查询的次数而已。然而,这种重建查询可以带来如下优势:

  • 缓存机制会更有效。很多应用直接使用 ORM 映射数据表。在这个例子中,如果 tag 为 mysql 的对象已经被缓存了,第一条查询就会跳过。如果 posts 中 id 为123,567或9908在缓存中,则可以从 IN 列表中移除这几个。通过这种策略,查询缓存会得到相应的受益。如果只有其中的一个表经常变化,拆解联合查询可以减少缓存失效的次数。

  • 单独执行这些查询有时候可以减少锁表的机会。

  • 通过这种方式很容易扩展数据库,并把数据表放到不同的机器上。

  • 查询自身可以进行优化。这个例子中,使用 IN 查询替代联合查询后,MySQL 对行 ID 进行排序和获取数据行有可能会更优。

  • 可以减少冗余的行访问。使用这种方式意味着只做一次数据行获取,而在联合查询中有可能重复获取相同的数据。基于这种原因,这种拆解方式也可能会减少整个网络负荷和内存占用。

  • 扩展一下,也可以通过人为进行哈希联合查询来替代MySQL联合查询的嵌套循环,哈希联合查询也可能会更有效。

最终可以看到,通过拆解联合查询可以使得缓存复用性更高,多服务器分布式数据方案更简单,并可以在大的数据表中使用 IN 查询替代联合查询或同一张表的多次重复查询。

以上是“MySQL怎么重写查询语句”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL怎么重写查询语句

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL怎么重写查询语句

这篇文章主要介绍MySQL怎么重写查询语句,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在优化存在问题的查询时,我们需要改变方式去获取查询结果——但这并不意味着从 MySQL获取同样的结果集。有些时候我们可以将查询转
2023-06-15

mysql查询语句怎么写

mysql 查询语句用于从数据库检索数据,遵循特定语法:select 子句指定要检索的列。from 子句指定要查询的表。where 子句筛选数据。group by 子句对数据分组。order by 子句对结果排序。limit 子句限制返回结
mysql查询语句怎么写
2024-05-30

sql语句去重查询怎么写

sql 去重查询使用 distinct 关键字和 select 语句从结果集中移除重复记录。它支持使用 where 子句和 group by 子句进行过滤和分组。示例:select distinct column_name(s) from
sql语句去重查询怎么写
2024-05-30

mysql查询死锁语句怎么写

这篇“mysql查询死锁语句怎么写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql查询死锁语句怎么写”文章吧。
2023-02-16

MySQL 重写查询语句的三种策略

在优化存在问题的查询时,我们需要改变方式去获取查询结果——但这并不意味着从 MySQL获取同样的结果集。有些时候我们可以将查询转换为获取相同结果,但更好性能的查询形式。然而,我们也需要考虑重写查询去获取不同的结果,因为这样可以提高开发效率。
2022-05-23

mysql数据库查询语句怎么写

mysql 查询语句是一组用于从数据库中检索数据的命令,基本语法包括:选择列名 (select)、指定表名 (from)、添加条件 (where)、分组数据 (group by)、设置分组条件 (having)、排序结果 (order by
mysql数据库查询语句怎么写
2024-04-22

navicat查询语句怎么写

navicat 查询语句使用标准 sql 语法,包含 select、from、where、order by 和 limit 等部分。查询示例包括检索所有客户信息、满足条件的客户信息(如以 "john" 开头)以及使用函数(如 count()
navicat查询语句怎么写
2024-04-24

MySQL查询外键约束语句怎么写

要查询外键约束,可以使用以下语句:SHOW CREATE TABLE table_name;其中,`table_name`是要查询外键约束的表名。这条语句将显示创建表的SQL语句,其中包括外键约束的定义。在结果中查找`FOREIGN KEY
2023-10-24

sql去重查询语句如何写

SQL中可以使用DISTINCT关键字来进行去重查询。例如,要查询一个表中的所有不重复的name值,可以使用以下语句:SELECT DISTINCT name FROM table_name;其中,name是表中的一个列名,table_na
2023-09-14

sql中查询语句怎么写

sql 查询语句用于从数据库中检索数据。其结构包括:select 子句(指定列)、from 子句(指定表)、可选的 where 子句(筛选数据)、可选的 order by 子句(排序结果)。编写查询语句的步骤包括:确定要检索的列、指定要查询
sql中查询语句怎么写
2024-05-10

sql分页查询语句怎么写

SQL分页查询语句可以使用LIMIT关键字来实现。具体语法如下:SELECT 列名FROM 表名LIMIT 开始位置, 查询条数;其中,开始位置表示从第几条记录开始查询,查询条数表示要查询的记录数。例如,如果要查询表"students"中的
2023-08-23

编程热搜

目录