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

最新文章

  1. LINQ系列:LINQ to SQL Where条件
  2. C#中dynamic的正确用法
  3. input属性控制弹出键盘类型
  4. RHEL查看CPU等机器信息
  5. D_S 线性结构
  6. Windows代码页、区域
  7. Python中变量的作用域(variable scope)
  8. Matlab使用心得
  9. sjtu1591 Count On Tree
  10. Delphi TdxBarmanager
  11. 一键分享到新浪微博、腾讯微博、搜狐微博、人人网、开心网、百度收藏等js代码大全
  12. Struts2 三、指定Struts2处理的请求后缀
  13. php将xml文件转化为数组:simplexml_load_string
  14. 深入理解SQL的四种连接
  15. HTML 部分常用属性、组成属性|...超链接、路径、锚点、列表、滚动、URL编码、表格、表单、GET和POST
  16. JAVA入门[21]-Jedis操作redis示例
  17. C 语言中模板的几种实现方式
  18. March 06th, 2018 Week 10th Tuesday
  19. 使用js下载文件
  20. Charles配置问题

热门文章

  1. hihoCoder #1094 : Lost in the City(枚举,微软苏州校招笔试 12月27日 )
  2. GSS4 - Can you answer these queries IV(线段树懒操作)
  3. android 2048游戏、kotlin应用、跑马灯、动画源码
  4. Android扫码二维码、美女瀑布流、知乎网易音乐、动画源码等
  5. 慕课网-前端JavaScrpt基础面试技巧-学习笔记
  6. js代码性能优化的几个方法
  7. python网络编程基础
  8. 动态查询:getBy字段名
  9. phpmyadmin 自动登录的办法
  10. label+input实现开关切换效果