Mysql order byとlimitを混用した罠


Mysqlでは常にorder byを使って並べ替えて、limitを使って改ページしています。優先順位を付けてから改ページする必要がある時、私たちはよく似たような書き方を使ってselect*from表名order by並べ替えフィールドlimt M,Nを使います。しかし、このような書き方は、落とし穴を深く使うことを隠しています。並べ替えフィールドにデータが重複している場合、並べ替え結果と予想されていたものとの不一致が生じやすくなります。
表のように:
在这里插入图片描述
在这里插入图片描述
最初のページと最後のページを検索するときに現れます。
在这里插入图片描述
在这里插入图片描述
解決策:

SELECT * FROM purchaseinfo ORDER BY actiontime,id LIMIT 0,2;
上記の実際の実行結果は現実と想像には往々にして差があることを証明しました。実際のSQL実行時は上記のように実行していません。ここは実はMysqlです。Limitを最適化します。具体的な最適化方式は公式文書に見られます。https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html

/*
Navicat MySQL Data Transfer

Source Server         :   mysql8.0
Source Server Version : 80018
Source Host           : localhost:3308
Source Database       : baihe

Target Server Type    : MYSQL
Target Server Version : 80018
File Encoding         : 65001

Date: 2020-06-09 14:47:37
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for purchaseinfo
-- ----------------------------
DROP TABLE IF EXISTS `purchaseinfo`;
CREATE TABLE `purchaseinfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) DEFAULT '0',
  `inout` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `money` int(11) DEFAULT NULL,
  `actiontime` datetime DEFAULT NULL COMMENT 'jiaoyi',
  PRIMARY KEY (`id`),
  KEY `UserId` (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of purchaseinfo
-- ----------------------------
INSERT INTO `purchaseinfo` VALUES ('7', '1', 'I', '10000', '2020-06-09 18:05:41');
INSERT INTO `purchaseinfo` VALUES ('8', '7788', 'O', '20000', '2020-06-09 18:05:15');
INSERT INTO `purchaseinfo` VALUES ('9', '7788', 'I', '20000', '2020-06-09 18:05:15');
INSERT INTO `purchaseinfo` VALUES ('10', '7788', 'O', '50000', '2020-06-09 18:05:15');
INSERT INTO `purchaseinfo` VALUES ('11', '1', 'O', '50000', '2020-06-09 18:05:15');
INSERT INTO `purchaseinfo` VALUES ('12', '1', 'O', '50000', '2020-06-09 18:05:15');
INSERT INTO `purchaseinfo` VALUES ('13', '1', 'O', '50000', '2020-06-09 18:05:15');
INSERT INTO `purchaseinfo` VALUES ('14', '1', 'O', '50000', '2020-06-09 18:05:15');
INSERT INTO `purchaseinfo` VALUES ('15', '1', 'O', '50000', '2020-06-09 18:05:15');
INSERT INTO `purchaseinfo` VALUES ('16', '1', 'O', '50000', '2020-06-09 18:05:15');

ここではMysql order byとlimitを混用したトラップに関する記事を紹介します。Mysql order byとlimitの関連内容は以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。