mysql 默认分页查询,主键索引,和联合唯一索引的坑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39338799/article/details/83546196

最近遇到一个比较坑的问题,列表分页查询的时候,查询全部没问题,根据条件查询就会出现乱序,多页之间有重复数据的问题。

因为用的通用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 指定排序。直接默认是不规范的,容易出问题

猜你喜欢

转载自blog.csdn.net/qq_39338799/article/details/83546196