MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで上位N行を効率的に取得する方法:インデックスとLIMITの活用テクニック

MySQLで上位N行のレコードを効率的に取得するには、インデックスを活用するのが効果的です。この記事では、実際にテーブルを作成しながら、ORDER BYとLIMITを組み合わせた効率的なデータ取得方法を解説します。

サンプルテーブルの作成

まず、デモ用のテーブルを作成しましょう。

mysql> create table DemoTable (StudentName varchar(100), StudentScore int);
Query OK, 0 rows affected (0.66 sec)

レコードの挿入

INSERTコマンドを使って、テーブルにいくつかのレコードを追加します。

mysql> insert into DemoTable values('John',34);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('Carol',55);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('Bob',58);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('Sam',38);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Mike',48);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('Adam',41);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Chris',47);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Robert',40);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('David',89);
Query OK, 1 row affected (0.18 sec)

登録済みレコードの確認

SELECT文を実行して、テーブル内の全レコードを表示します。

mysql> select *from DemoTable;

出力結果

+-------------+--------------+
| StudentName | StudentScore |
+-------------+--------------+
| John | 34 |
| Carol | 55 |
| Bob | 58 |
| Sam | 38 |
| Mike | 48 |
| Adam | 41 |
| Chris | 47 |
| Robert | 40 |
| David | 89 |
+-------------+--------------+
9 rows in set (0.00 sec)

上位N行を効率的に選択するクエリ

ここからが本題です。上位N行を効率的に取得するには、まず複合インデックスを作成します。その後、ORDER BYで並べ替えを行い、LIMIT 5,3を指定することで、先頭の5行をスキップして、続く3件のレコードを取得しています。

mysql> alter table DemoTable ADD INDEX name_score(StudentName,StudentScore);
Query OK, 0 rows affected (0.61 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select StudentName,StudentScore from DemoTable order by StudentScore LIMIT 5,3;

出力結果

+-------------+--------------+
| StudentName | StudentScore |
+-------------+--------------+
| Mike | 48 |
| Carol | 55 |
| Bob | 58 |
+-------------+--------------+
3 rows in set (0.00 sec)

ポイント解説

このクエリが効率的に動作する理由は、以下の3点にあります。

  • 複合インデックスの作成:ALTER TABLE文でname_scoreという複合インデックスを追加することで、並べ替え処理が高速化されます。
  • ORDER BYによる並べ替え:StudentScoreを基準に昇順でソートし、スコアの低い順にレコードを整列させます。
  • LIMIT 5,3による範囲指定:最初の5行をスキップし、続く3行だけを取得します。大量データから特定範囲のレコードを取り出すページネーション処理に非常に有効です。

インデックスを適切に設定しておくことで、大規模なテーブルでも高速な上位N行の取得が可能になります。パフォーマンスを意識したクエリ設計の参考にしてください。

  1. MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法(NATURAL LEFT JOIN活用)

    MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法データベースの運用では、「片方のテーブルには存在するが、もう片方のテーブルには存在しないレコード」を抽出したい場面がよくあります。この記事では、2つのテーブルを作成し、NATURAL LEFT JOINを活用して差分の行を取得する方法を、実際のサンプルコードとともにわかりやすく解説します。1. 最初のテーブルを作成するまずは比較元となる最初のテーブルを作成します。 mysql> create table FirstTableDemo -> ( -> id int, -> name v

  2. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected