zoukankan      html  css  js  c++  java
  • MySQL笔记-语句的执行顺序

      在一次查询线上问题时发现有以下两条同样的SQL,执行后数据的顺序不一样:

      SELECT * FROM nns_assists_item AS asset WHERE asset.nns_assist_id='mgtv' AND asset.nns_category_id LIKE '1000003%' AND (asset.nns_tag='' OR ISNULL(asset.nns_tag) OR LOCATE(',26,',CONCAT(',',asset.nns_tag))>0) AND asset.nns_check=1 GROUP BY asset.nns_video_id ORDER BY asset.nns_create_time DESC ,nns_release_time DESC,nns_id DESC LIMIT 0,4;

      SELECT * FROM nns_assists_item AS asset WHERE asset.nns_assist_id='mgtv' AND asset.nns_category_id LIKE '1000003%' AND (asset.nns_tag='' OR ISNULL(asset.nns_tag) OR LOCATE(',26,',CONCAT(',',asset.nns_tag))>0) AND asset.nns_check=1 GROUP BY asset.nns_video_id ORDER BY asset.nns_create_time DESC ,nns_release_time DESC,nns_id DESC LIMIT 0,10;

      两条SQL除了后面的limit限制条件不同以外都是一样的。

      执行出的数据顺序不同只能在数据量大的时候会出现。

      最后在了解了MySQL语句的执行顺序之后,大概猜到了为什么出现这样的问题。

      MySQL的语句执行顺序是

      

       这两条SQL使用group by来做排重然后在使用order by来做一次排序。

      在我的理解中,产生这个问题的原始是这样的:group by时本身也会做一个分组内的排序,我们的业务中分组依据是nns_video_id,这个字段的值是guid字符串。我认为在分组时的排序时guid字符串的排序在大量数据时出现了不准确的情况。

      根据语句的执行顺序我们知道,无论我们如何修改后面order by的条件都是不可能让两者的顺序一致的,我的解决方法是在group by中再添加一个分组条件。

  • 相关阅读:
    02 微服务应用的认证与授权
    01 微服务架构中的服务发现作用以及两种协议的调用区别
    04 redis的数据结构与对象
    03 Spring的事务管理的基本使用
    02 Spring的AOP的基础概念与简单使用
    k8s环境部署
    elk安装
    实现AD域验证登录--
    linux SSH各配置项解释
    Linux学习之SAMBA共享(密码验证)
  • 原文地址:https://www.cnblogs.com/ymkfnuiwgij/p/6486875.html
Copyright © 2011-2022 走看看