ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Mysql_Order_By的坑

2022-03-26 09:04:40  阅读:179  来源: 互联网

标签:COMMENT code yard DEFAULT Mysql update time Order


CREATE TABLE `tt_transfer_container_pick_config` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `yard_code` varchar(11) NOT NULL DEFAULT '' COMMENT '场地代码',
	...
  `version` bigint(20) DEFAULT NULL COMMENT '版本号',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_yard_code` (`yard_code`) USING BTREE COMMENT '场院代码索引',
	...
  KEY `idx_create_time` (`create_time`) USING BTREE COMMENT '创建时间索引',
  KEY `idx_update_time` (`update_time`) USING BTREE COMMENT '更新时间索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='容器分拣配置表';

查询时出问题的就是这张表

出错的查询语句

SELECT * 
FROM tt_transfer_container_pick_config 
WHERE 
    yard_code = '735VA' 
    AND 
    ...
    AND
    is_delete = 0 
    AND 
    invalid_time > NOW() 
    ORDER BY  update_time DESC
    LIMIT 1, 10;

order by update_time DESC咋一看没有问题,update_time 是每次都是由mysql自动更新的,感觉会一直递增

第一个问题:

实际上如果在同一个事务里,批量插入多条数据,这里的update_time会是一样的,因为是事务结束时一齐从内存中写进数据库里的(用Excel导入且在同一个事务中测试得出的结论)

由第一个问题引发的第二个问题(当然如果通过脚本直接改update_time为一样的,也会有这个问题):

就是order by update_time DESC时,mysql会用他自己的随机算法从中抽取你需要的量的数据给你,比如上述需要9条数据,匹配的数据里有100条,就会随机抽取9条数据给你,而由于mysql自己有缓存提速机制,会导致如果第一次拿到的数据不对,后面再用相同的sql查数据都是之前的错误数据,而且每次分页查(查其他分页)都是随机的,会有的页出现其他页存在重复数据,有的数据永远读不出来的现象

更正方法:在order by 中 加入主键 id 排序,这样就能保证所有的数据都可以在分页中查出来,并且各个分页的数据有序且不重复

SELECT * 
FROM tt_transfer_container_pick_config 
WHERE 
    yard_code = '735VA' 
    AND 
    ...
    AND
    is_delete = 0 
    AND 
    invalid_time > NOW() 
    ORDER BY id ASC, update_time DESC
    LIMIT 1, 10;

标签:COMMENT,code,yard,DEFAULT,Mysql,update,time,Order
来源: https://www.cnblogs.com/gradyblog/p/16057628.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有