1. 程式人生 > >mysql 預設分頁查詢,主鍵索引,和聯合唯一索引的坑

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 指定排序。直接預設是不規範的,容易出問題