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中再添加一个分组条件。

  • 相关阅读:
    IDEA中代码无故报红解决方法
    CAP原则的基本理论知识
    Java IO 拷贝MP3文件,包括递归子文件夹下的文件
    maven 配置阿里云镜像 settings.xml内容
    Restful API 级别及意义
    日常巡检(脚本)
    使用Matplotlib画图系列(一)
    Python 阶乘factorial
    交叉验证思想
    FeatureSelectors
  • 原文地址:https://www.cnblogs.com/ymkfnuiwgij/p/6486875.html
Copyright © 2011-2022 走看看