mysql 默认分页查询,主键索引,和联合唯一索引的坑
最近遇到一个比较坑的问题,列表分页查询的时候,查询全部没问题,根据条件查询就会出现乱序,多页之间有重复数据的问题。
因为用的通用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 指定排序。直接默认是不规范的,容易出问题