MySQL优化七-重构查询方式

这篇具有很好参考价值的文章主要介绍了MySQL优化七-重构查询方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

优化有问题的查询时,有时转换下写法,返回的结果不变,但性能却有所提升。

目录

一、切分查询

二、分解关联查询

三、优化count()查询

四、优化关联查询

五、优化group by 查询

六、优化limit 分页


一、切分查询

场景:定期清除大量数据时,如果用一个大的语句一次性完成的话,则可能一次锁住很多数据,占满事务日志,阻塞查询。

优化:将一个大的delete语句切分为多个较小的查询,可以尽可能小地影响mysql性能,同时还可以减少mysql复制的延迟。

案例:

mysql > delete from messages from created_date < now()

********用类似下面的办法也可以完成

row_affected = 0
do {
    row_affected = do_query {
        " delete from messages from created_date < now() limit 10000"
    }
} while row_affected > 0

这样重构之后,一次只删除1万行,循环判断是否还有可删除的记录。

二、分解关联查询

很多高性能的应用会对关联查询进行分解,简单地说,可以对每个表进行单表查询,然后将结果在应用程序中进行关联。例如:

mysql > select t1*  from tag t1 inner join tag_post t2
        on t1.tag_id = t2.tag_id

*******分解成以下查询可代替
mysql > select * from tag_post where tag = 'mysql'
        select * from tag where tag_id in ( 1234 , 1245 )

分解关联查询的好处如下:

1、让缓存的效率更高。

2、单个查询可能减少锁表的竞争。

3、使用IN()代替关联查询,可让mysql按id顺序查询,比随机关联更高效。

4、减少冗余记录的查询。

5、在应用中实现了哈希关联。而不是使用mysql嵌套循环关联。

三、优化count()查询

当使用count(*)  ,不会像我们猜想的扩展所有的列,而是忽略所有的列,直接统计所有的行数。所有统计行数,不要在括号内指定列,而是直接用count(*)       

利用count(*) 全表统计快的特性,还可以作如下的处理。

mysql> select count(*) from repayment where id > 5

********改写如下:

mysql> select ( select count(*) from repayment - count(*) ) 
        from repayment where id < 5 

 这样优化器按id顺序查询,只需要查前5条记录。

四、优化关联查询

如果表A和表B用列C作关联,关联顺序是A join B,此时只需要在B表的C列建索引,没用到的索引只会带来额外的负担。

五、优化group by 查询

如果对关联查询做分组group by ,按表中的某个列分组。通常采用表的标识列分组的效率会更高一些。

mysql> select t1.first_name, t1.last_name, count(*) 
    ->from film_actor t1 inner join  actor  t2 on t1.actor_id = t2.actor_id 
    ->group by t1.first_name,t1.last_name
*****这样查效率不高,改写如下效率会更高:
mysql> select t1.first_name, t1.last_name, count(*) 
    ->from film_actor t1 inner join  actor  t2 on t1.actor_id = t2.actor_id 
    ->group by t2.actor_id 

这个查询 利用了actor的名字和id直接相关的特点,改写后查询的结果不影响。

六、优化limit 分页

limit 10000,10,这样的查询,mysql需要查10000条记录后返回10条查询结果,前面的10000条记录将被丢弃,这样的代价很高。优化的方法是尽可能地使用索引覆盖查询。文章来源地址https://www.toymoban.com/news/detail-484396.html

mysql> select film_id , description from film order by title limit 10000,10
*******改写如下:
mysql> select film_id , description from film t1
    -> inner join ( select film_id from film order by title limit 10000,10) t2
    -> on t1.film_id = t2.film_id

到了这里,关于MySQL优化七-重构查询方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL索引优化与查询优化

    MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了访问高效数据的方法,并且加快查询的速度,因此索引对查询的速度有着至关重要的影响。 使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。 如果查询时没

    2024年02月05日
    浏览(50)
  • mysql进阶-查询优化-慢查询日志

    日志对一个程序来说非常重要,他能帮助程序员在系统出现问题时快速定位问题, 慢查询日志 ( slow query log )是MySQL自带的几种日志文件中非常重要的一种日志(另还有错误日志、查询日志、二进制日志)。MySQL的慢查询日志是用于记录执行时间超过指定阈值的SQL查询语句的一

    2024年02月03日
    浏览(49)
  • MySQL查询性能优化——SQL优化(四)

      目录 1、批量插入数据 1.1 linux环境下 1.1.1 开启文件读取 1.1.2 load数据 1.2 windows环境下 2、order by优化 2.1 最左前缀 3、group by 3.1 最左前缀 4、count优化 5、or条件优化   在上一期说到索引的使用,这期来聊一下SQL优化,也是平常写SQL的时候常用到的。 在前几期也有聊到过批量插

    2024年02月19日
    浏览(61)
  • Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!

    集群配置为:8 个 node 节点,16 核 32G,索引 4 分片 1 副本。应用程序的查询逻辑是按经纬度排序后找前 200 条文档。 1、应用对查询要求比较高,search 没有慢查询的状态。 2、集群压测性能不能上去,cpu 使用未打满,查询的 qps 上不去,且有队列堆积。 通过云厂商内核组的同

    2024年02月04日
    浏览(47)
  • 【性能优化】MySql数据库查询优化方案

    了解系统运行效率提升的整体解决思路和方向 学会MySQl中进行数据库查询优化的步骤 学会看慢查询、执行计划、进行性能分析、调优 ​关于这个问题,我们通常首先考虑的是硬件升级,毕竟服务器的内存、CPU、磁盘IO速度 、网络速度等都是制约我们系统快慢的首要因素。硬

    2024年02月03日
    浏览(59)
  • MySQL 慢查询优化案例

    ​优质博文:IT-BLOG-CN 【1】先运行看看是否真的很慢,注意设置SQL_NO_CACHE(查询时不使用缓存); 【2】where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的 where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高

    2024年04月14日
    浏览(75)
  • MySql查询性能优化

    慢查询判定 慢查询优化 是否向服务器请求列不必要的数据 是否走索引 建立索引的原则: 最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(、、between、like)就停止匹配,比如a = 1 and b = 2 and c 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c

    2024年03月13日
    浏览(36)
  • mysql 查询优化 、索引失效

    查询优化 物理查询优化 通过索引和表连接方式等技术来进行优化,这里重点需要掌握索引的使用 逻辑查询优化 通过SQL 等价变换 提升查询效率,直白一点就是说,换一种查询写法执行效率可能更高 索引失效 计算、函数、类型转换(自动或手动)导致索引失效 select sql_no_c

    2024年02月10日
    浏览(49)
  • MySQL 如何优化慢查询?

    在日常开发中,我们往往会给表加各种索引,来提高 MySQL 的检索效率。 但我们有时会遇到明明给字段加了索引,并没有走索引的Case。 进而导致 MySQL 产生慢查询。 严重场景下,甚至出现主从延迟、数据库拖垮的极端事故。 本文梳理出索引失效的几种常见场景给大家参考。

    2024年02月05日
    浏览(44)
  • 【MySQL高级篇笔记-索引优化与查询优化(中) 】

    此笔记为尚硅谷MySQL高级篇部分内容 目录 一、索引失效案例 二、关联查询优化 1、采用左外连接 2、采用内连接 3、join语句原理 1.驱动表和被驱动表 2.Simple Nested-Loop Join(简单嵌套循环连接) 3.Index Nested-Loop Join(索引嵌套循环连接) 4.Block Nested-Loop Join(块嵌套循环连接) 5.Join小结

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包