mysql关联查询和查询优化

mysql关联查询

 参考:https://blog.csdn.net/lu0422/article/details/78892497

mysql查询慢的原因

  • 记录慢查询日志
    分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和经历,可以使用pt-query-digest工具进行分析
  • 使用show profile
    set profileing = 1;开启,服务器上执行所有语句会检测消耗的时间,存到临时表中
    show profiles
    show profile for query Query_ID

 show profiles  查看所有查询消耗 的时间

show profile for query Query_ID   查看某一条语句查询的具体消耗时间;

  • 使用show status
    show status会返回一些计数器,show global status 查看服务器级别的所有计数
    有时根据这些计数,可以猜测出那些操作代价较高或消耗时间多
  • show processlist
    观察是否有大量线程处于不正常的状态或特征
  • explain
    分析单条的SQL语句

  

mysql查询优化的方式

  • 访问数据太多会导致查询性能下降(不要用select *)
    • 确定MySQL服务器是否在分析大量不必要的数据行
    • 确定应用程序是否在检索大量超过需要的数据,可能是太多行或列
    • 避免使用如下SQL语句
      • 查询不需要的数据,使用limit解决
      • 所表关联返回全部列,制定A.id,A.name,B.age
      • 总是取出全部列,SELECT * 会让优化器无法完成索引覆盖扫描的优化
      • 重复查询相同的数据,可以缓存数据,下次直接读取缓存
    • 是否在扫描额外的记录
      • 使用explain来进行分析,如果发现查询需要扫描大量的数据但是只返回少数行可以用如下技巧去优化:
        • 使用索引覆盖扫描,把所有用的列都放在索引中,这样存储引擎不需要回表获取对应行就可以返回结果
        • 改变数据库的表的结构,修改数据表范式(如果经常需要关联查询,可将另一张表的字段冗余地存储在要查询的表中,以空间换取时间)
        • 重写SQL语句,让优化器可以以更优的方式执行查询
  • 优化长难的查询语句
    • 切分查询
      将一个大的查询分为多个小的相同的查询
    • 分解关联查询
      可以将一条关联查询分解成多条SQL来执行,可以让缓存的效率更高,执行单个查询可以减少锁的竞争,在应用层做关联可以更容易对数据进行拆分,查询效率会有大幅提升,较少冗余记录的查询
  • 优化特定类型的查询语句
    • 优化count()查询
      • count(*)中的*会忽略所有的列,直接统计所有列数,因此不要使用count(列名)
      • MyISAM中,没有任何WHERE条件的count(*)非常快,当有WHERE条件时,MyISAM的count统计不一定比其他表引擎快
      • 可以使用explain查询近似值,用近似值代替count(*)
      • 增加汇总表
      • 使用缓存
    • 优化关联查询
      • 确定ON 或者 USING子句的列上有索引

        Mysql 中联接SQL语句中,ON子句的语法格式为:table1.column_name = table2.column_name。
        当模式设计对联接表的列采用了相同的命名样式时,就可以使用 USING 语法来简化 ON 语法,格式为:USING(column_name)。

      • 确保GROUP BY 和 ORDER BY中只有一个表中的列,这样MySQL才能使用索引
    • 优化子查询
      • 用关联查询替代
    • 优化GROUP BY 和 DISTINCT
      • 这两种查询均可以使用索引来优化,是最有效的优化方法
      • 关联查询中,使用表示列进行分组的效率会更高(尽量使用主键、自增列等)
      • 如果不需要ORDER BY ,进行GROUP BY 时使用ORDER BY NULL ,mysql不会再进行文件排序
    • 优化LIMIT分页
      • LIMIT偏移量大时,查询效率低
      • 可以记录上次查询的最大ID,下次查询时直接根据该ID来查询
    • 优化UNION查询
      • UNION ALL查询效率高于UNION

引用的连接:https://www.cnblogs.com/clannadxr/p/7806090.html

引用的连接:https://blog.csdn.net/qq_35571554/article/details/82800463

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值