赞
踩
最近遇到一个比较坑的问题,列表分页查询的时候,查询全部没问题,根据条件查询就会出现乱序,多页之间有重复数据的问题。
因为用的通用mapper组件,于是打出来sql看了下,发现分页查询sql没有order by,结果查询出来的顺序是乱的,因为查询条件之一是联合唯一索引的第一个字段,因为索引左前缀规则 ,有时候按照主键id排序,有时候按照联合唯一索引之一排序,不同的页面有重复的数据。
表结构:
- DROP TABLE IF EXISTS `t_pos_payment_code`;
-
- CREATE TABLE `t_pos_payment_code` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `pos_channel_id` int(10) DEFAULT NULL COMMENT 'POS Channel Id',
- `payment_code_group_id` int(10) unsigned NOT NULL COMMENT 'Payment code group ID',
- `pos_issuer_code` varchar(10) COLLATE utf8_bin NOT NULL COMMENT 'POS Issuer Code',
- `issuer_code` varchar(10) COLLATE utf8_bin NOT NULL COMMENT 'Issuer Code',
- `issuer_name` varchar(50) COLLATE utf8_bin NOT NULL COMMENT 'Issuer Name',
- `create_datetime` datetime DEFAULT NULL COMMENT 'create_datetime',
- `modify_datetime` datetime DEFAULT NULL COMMENT 'modify_datetime',
- `teller` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'teller',
- `comment` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'comment',
- PRIMARY KEY (`id`),
- UNIQUE KEY `uniq_payment_code_group_id_issuer_code` (`payment_code_group_id`,`issuer_code`) USING BTREE
- ) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='SPS Mgmt t_pos_payment_code';
sql:
- SELECT id,pos_channel_id,payment_code_group_id,pos_issuer_code,issuer_code,issuer_name,COMMENT,teller,create_datetime,modify_datetime FROM t_pos_payment_code WHERE payment_code_group_id = 1024 LIMIT 0,20
-
- SELECT id,pos_channel_id,payment_code_group_id,pos_issuer_code,issuer_code,issuer_name,COMMENT,teller,create_datetime,modify_datetime FROM t_pos_payment_code WHERE payment_code_group_id = 1024 LIMIT 20,20
查询结果:
发现是mysql索引的问题,参考博文:https://www.cnblogs.com/yaowen/p/8268183.html
解决就是在查询语句中加上order by 指定排序。直接默认是不规范的,容易出问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。