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中再添加一个分组条件。
最新文章
- LINQ系列:LINQ to SQL Where条件
- C#中dynamic的正确用法
- input属性控制弹出键盘类型
- RHEL查看CPU等机器信息
- D_S 线性结构
- Windows代码页、区域
- Python中变量的作用域(variable scope)
- Matlab使用心得
- sjtu1591 Count On Tree
- Delphi TdxBarmanager
- 一键分享到新浪微博、腾讯微博、搜狐微博、人人网、开心网、百度收藏等js代码大全
- Struts2 三、指定Struts2处理的请求后缀
- php将xml文件转化为数组:simplexml_load_string
- 深入理解SQL的四种连接
- HTML 部分常用属性、组成属性|...超链接、路径、锚点、列表、滚动、URL编码、表格、表单、GET和POST
- JAVA入门[21]-Jedis操作redis示例
- C 语言中模板的几种实现方式
- March 06th, 2018 Week 10th Tuesday
- 使用js下载文件
- Charles配置问题
热门文章
- hihoCoder #1094 : Lost in the City(枚举,微软苏州校招笔试 12月27日 )
- GSS4 - Can you answer these queries IV(线段树懒操作)
- android 2048游戏、kotlin应用、跑马灯、动画源码
- Android扫码二维码、美女瀑布流、知乎网易音乐、动画源码等
- 慕课网-前端JavaScrpt基础面试技巧-学习笔记
- js代码性能优化的几个方法
- python网络编程基础
- 动态查询:getBy字段名
- phpmyadmin 自动登录的办法
- label+input实现开关切换效果