MySQLのorder byとlimitを混在させる際の落とし穴の詳細な説明

MySQLのorder byとlimitを混在させる際の落とし穴の詳細な説明

MySQL では、ソートには order by を、ページングには limit をよく使用します。最初にソートしてからページングする必要がある場合は、select * from table name order by sort field 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データ転送

ソースサーバー: ローカル mysql8.0
ソース サーバー バージョン: 80018
ソースホスト: localhost:3308
ソースデータベース: baihe

ターゲットサーバータイプ: MYSQL
ターゲット サーバー バージョン: 80018
ファイルエンコーディング: 65001

日付: 2020-06-09 14:47:37
*/

FOREIGN_KEY_CHECKS=0 に設定します。

-- ----------------------------
-- 購入情報のテーブル構造
-- ----------------------------
`purchaseinfo` が存在する場合はテーブルを削除します。
テーブル「purchaseinfo」を作成します(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) デフォルト '0',
  `inout` varchar(1) 文字セット utf8mb4 COLLATE utf8mb4_0900_ai_ci デフォルト NULL,
  `money` int(11) デフォルト NULL,
  `actiontime` datetime デフォルト NULL コメント 'jiaoyi',
  主キー (`id`)、
  キー `UserId` (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=17 デフォルト CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- 購入記録情報
-- ----------------------------
`purchaseinfo` に値 ('7'、'1'、'I'、'10000'、'2020-06-09 18:05:41') を挿入します。
`purchaseinfo` に値 ('8'、'7788'、'O'、'20000'、'2020-06-09 18:05:15') を挿入します。
`purchaseinfo` に値 ('9'、'7788'、'I'、'20000'、'2020-06-09 18:05:15') を挿入します。
`purchaseinfo` に値 ('10'、'7788'、'O'、'50000'、'2020-06-09 18:05:15') を挿入します。
`purchaseinfo` に値 ('11'、'1'、'O'、'50000'、'2020-06-09 18:05:15') を挿入します。
`purchaseinfo` に値 ('12'、'1'、'O'、'50000'、'2020-06-09 18:05:15') を挿入します。
`purchaseinfo` に値 ('13'、'1'、'O'、'50000'、'2020-06-09 18:05:15') を挿入します。
`purchaseinfo` に値 ('14'、'1'、'O'、'50000'、'2020-06-09 18:05:15') を挿入します。
`purchaseinfo` に値 ('15'、'1'、'O'、'50000'、'2020-06-09 18:05:15') を挿入します。
`purchaseinfo` に値 ('16'、'1'、'O'、'50000'、'2020-06-09 18:05:15') を挿入します。

これで、MySQL の order by と limit を混在させる際の落とし穴に関するこの記事は終わりです。MySQL の order by と limit を混在させる方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySql ページングで limit+order by を使用する場合のデータ重複の解決策
  • MySQLサブクエリでorder byが効かない問題の解決方法
  • MySQLでorder byを使用せずにランキングを実装する3つの方法のまとめ
  • MySQL の group by と order by を一緒に使用する方法
  • インデックスを使用して MySQL ORDER BY ステートメントを最適化する方法
  • MySQL のソートとページング (order by と limit) と既存の落とし穴
  • MySQLにおける(JOIN/ORDER BY)文のクエリ処理と最適化方法
  • MySQLは「order by」がどのように機能するかを簡単に理解します
  • MySQL の order by ステートメントの最適化方法の詳細な説明
  • MySQL での order by の使用に関する詳細

<<:  Azure Container Registry を使用してイメージを保存する際の問題

>>:  Vue プロジェクトの最初の画面のパフォーマンス最適化コンポーネントの実践ガイド

推薦する

MySQLデータベースで外部キー制約を使用する必要があるかどうかの詳細な説明

1. はじめに外部キー制約を使用するかどうかという話題は、すでに決まり文句になっています。学校では、...

Dockerボリューム権限管理の詳細な説明

ボリュームデータボリュームは Docker の重要な概念です。データ ボリュームは、1 つ以上のコン...

Linux でのスケジュールされたタスクと遅延タスクの詳細な説明

で+ 時間 17:23に at> touch /mnt/file{1..9} ##アクションを...

CSS アニメーション プロパティの使用方法とサンプル コード (transition/transform/animation)

開発中、優れたユーザー インターフェイスには常にいくつかのアニメーションが組み込まれます。 CSS ...

リモート Linux システムでポートが開いているかどうかを確認する 3 つの方法

これは、Linux 管理者だけでなく、私たち全員にとって非常に重要なトピックです。つまり、IT イン...

Dockerコンテナのタイムゾーン調整操作

Docker コンテナのタイムゾーンがホストマシンと一致しているかどうかを確認するにはどうすればよい...

非表示のフォームテキストを表示するJavaScript

この記事では、フォームの隠しテキストを表示するためのJavaScriptの具体的なコードを参考までに...

Nginx ロケーション設定(ロケーションのマッチング順序)の詳細な説明

ロケーションは「位置指定」を意味し、主にさまざまな位置指定のための URI に基づいています。これは...

MySQL で binlog を使用する際のフォーマットの選択方法

目次1. binlogの3つのモード1.ステートメントレベルモード2. 行レベルモード3. 混合モー...

Dockerコンテナのログ処理の詳細な説明

Docker には多くのログ プラグインがあります。デフォルトでは json-file を使用します...

MySQL の DDL と DML についての簡単な説明

目次序文1. DDL 1.1 データベース操作1.2 データテーブルの操作1.3 一般的なデータ型1...

MySQL デッドロック ルーチン: 一意のインデックスの下でのバッチ挿入順序の不一致

序文デッドロックの本質はリソースの競合です。バッチ挿入の順序が一貫していないと、デッドロックに陥りや...

Centos7 環境でバイナリ インストール パッケージから mysql5.6 をインストールする方法の詳細な説明

この記事では、centos7 環境でバイナリ インストール パッケージを使用して mysql5.6 ...

Vue-cli を使用して Vue プロジェクトを構築する手順の詳細な説明

まず、Vue-cli をインストールする必要があります。 npm インストール -g vue-cli...

MySQL テーブルの断片化を解消し、スペースを再利用する方法

目次MySQL テーブルの断片化の原因行の断片化行内断片化空き領域の断片化MySQL で極度に断片化...