mysql 預設分頁查詢,主鍵索引,和聯合唯一索引的坑
阿新 • • 發佈:2018-10-31
最近遇到一個比較坑的問題,列表分頁查詢的時候,查詢全部沒問題,根據條件查詢就會出現亂序,多頁之間有重複資料的問題。
因為用的通用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 指定排序。直接預設是不規範的,容易出問題