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行の取得が可能になります。パフォーマンスを意識したクエリ設計の参考にしてください。
-
MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法(NATURAL LEFT JOIN活用)
MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法データベースの運用では、「片方のテーブルには存在するが、もう片方のテーブルには存在しないレコード」を抽出したい場面がよくあります。この記事では、2つのテーブルを作成し、NATURAL LEFT JOINを活用して差分の行を取得する方法を、実際のサンプルコードとともにわかりやすく解説します。1. 最初のテーブルを作成するまずは比較元となる最初のテーブルを作成します。 mysql> create table FirstTableDemo -> ( -> id int, -> name v
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected