在一次查询线上问题时发现有以下两条同样的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中再添加一个分组条件。

MySQL笔记-语句的执行顺序的更多相关文章

  1. mysql查询语句的执行顺序(重点)

    一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...

  2. MySQL——sql语句的执行顺序

    #核心知识点: 书写顺序:where——>group by——>having——>order by——>limit 许多时候在书写一些复杂的sql语句的时候,尤其是在渐进式推导 ...

  3. MySQL Select语句的执行顺序

    源文章:How is a query executed in MySQL? 当执行SQL的Select查询语句时,SQL指令的执行顺序如下: FROM 子句 WHERE 子句 GROUP BY 子句 ...

  4. mysql 查询语句的执行顺序(重重点)

    一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...

  5. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  6. mysql 中sql语句的执行顺序

    今天突然想起来,之前面试一个很牛逼的公司(soho)的时候,一个美眉面试官,面试的时候问到了很多之前都没有意识到的问题,回想起来那美眉看着年纪不大,技术那是真666啊.好了说一下人家问的这个有关mys ...

  7. 浅谈SQL优化入门:1、SQL查询语句的执行顺序

    1.SQL查询语句的执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_ ...

  8. mysql 中sql的执行顺序

    文章转自 https://www.cnblogs.com/annsshadow/p/5037667.html https://www.cnblogs.com/yyjie/p/7788428.html ...

  9. mysql join语句的执行流程是怎么样的

    mysql join语句的执行流程是怎么样的 join语句是使用十分频繁的sql语句,同样结果的join语句,写法不同会有非常大的性能差距. select * from t1 straight_joi ...

随机推荐

  1. 深度优先搜索(DFS)专题讲座PPT截图【需要原稿的请留言或私信】

    以下是今晚我在bilibili直播讲DFS算法的时候的ppt截图,ppt搞了一下午,水平有限,只能做成这个样子,供大家参考!(如果需要原稿,请在评论区留言或私信告诉我,我会发到你的邮箱里),感谢各位的 ...

  2. Uva - 12050 Palindrome Numbers【数论】

    题目链接:uva 12050 - Palindrome Numbers 题意:求第n个回文串 思路:首先可以知道的是长度为k的回文串个数有9*10^(k-1),那么依次计算,得出n是长度为多少的串,然 ...

  3. float浮动属性的基本常识

    CSS 浮动 请看下图,当把框 1 向右浮动时,它脱离文档流并且向右移动,直到它的右边缘碰到包含框的右边缘: 再请看下图,当框 1 向左浮动时,它脱离文档流并且向左移动,直到它的左边缘碰到包含框的左边 ...

  4. sizeof与strlen的不同

    sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小. sizeof是算符,strlen是函数. si ...

  5. Mac下安装MySQL及启动等常用命令

    总结了下mac下的mysql安装步骤:   eclipse JavaEE 下载         JDK -9 macosx下载   一.安装及启动服务 1. MySQL Server 下载.(以mys ...

  6. YUI 的模块信息配置优先级关系梳理

    背景 YUI的配置参数较多, 可以在好几个地方配置一个module的相关信息, 如: //在全局配置, 所以YUI实例共享 YUI_config = { modules: { 'w-autcomple ...

  7. dig(域信息搜索器)命令

    dig命令   dig命令是常用的域名查询工具,可以用来测试域名系统工作是否正常. 语法 dig(选项)(参数) 选项 @<服务器地址>:指定进行域名解析的域名服务器: -b<ip地 ...

  8. tp5 $_ENV获取不到数据

    $_ENV变量是取决于服务器的环境变量的,从不同的服务器上获取的$_ENV变量打印出的结果可能是不同的. php的配置文件php.ini的配置项为:variables_order = "GP ...

  9. eclipse中git解决冲突

    摘录自http://blog.csdn.net/rosten/article/details/17068285 1. 工程->Team->同步 2.从远程pull至本地,就会出现如下内容 ...

  10. Java数据持久层框架 MyBatis之API学习三(XML 映射配置文件)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...