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

MySQLでLIMITとOFFSETを使って1バッチずつ行を取得する方法

LIMITとOFFSETによるバッチ取得の基本

MySQLで大量のデータを少しずつ処理したい場合、LIMIT句OFFSET句を組み合わせるのが定番の手法です。LIMITは取得する行数を指定し、OFFSETは先頭から読み飛ばす行数を指定します。この2つを活用することで、テーブルの行を1バッチずつ順番に取り出せます。

まずは、動作確認用のサンプルテーブルを作成しましょう。

mysql> create table DemoTable1514
   -> (
   -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   -> FirstName varchar(20)
   -> );
Query OK, 0 rows affected (0.63 sec)

サンプルデータの挿入

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

mysql> insert into DemoTable1514(FirstName) values('Chris');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1514(FirstName) values('Bob');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1514(FirstName) values('Sam');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable1514(FirstName) values('Mike');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1514(FirstName) values('Carol');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1514(FirstName) values('David');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1514(FirstName) values('Robert');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1514(FirstName) values('Adam');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1514(FirstName) values('John');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1514(FirstName) values('Jace');
Query OK, 1 row affected (0.13 sec)

登録済みレコードの確認

SELECT文ですべてのレコードを表示してみます。

mysql> select * from DemoTable1514;

実行すると、以下のように10件のレコードが出力されます。

+----+-----------+
| Id | FirstName |
+----+-----------+
|  1 | Chris     |
|  2 | Bob       |
|  3 | Sam       |
|  4 | Mike      |
|  5 | Carol     |
|  6 | David     |
|  7 | Robert    |
|  8 | Adam      |
|  9 | John      |
| 10 | Jace      |
+----+-----------+
10 rows in set (0.00 sec)

1バッチずつ行を取得するクエリ

それでは、本題である「1バッチずつ行を選択する」クエリを見ていきましょう。ここでは、4行を1バッチとして取得します。

mysql> select * from DemoTable1514 limit 4 offset 4;

実行結果は以下のとおりです。

+----+-----------+
| Id | FirstName |
+----+-----------+
|  5 | Carol     |
|  6 | David     |
|  7 | Robert    |
|  8 | Adam      |
+----+-----------+
4 rows in set (0.00 sec)

このクエリでは、「limit 4 offset 4」と指定することで、先頭の4行を読み飛ばし、5行目から8行目までの4件を取得しています。OFFSETの値を4ずつ増やしながら(例:offset 0、offset 4、offset 8…)繰り返し実行すれば、テーブル全体をバッチ単位で順番に処理できます。

なお、大量データを扱う場合は、OFFSETが大きくなるほどパフォーマンスが低下する点に注意してください。そのようなケースでは、主キー(Id)を条件にして「前回取得した最後のIDより大きい行」を取得するキーセットページネーションを採用すると、より高速かつ安定したバッチ処理が可能になります。

  1. MySQLでクエリ結果をランダムに並べ替え、ランダムな行を選択する方法

    MySQLでクエリの結果をランダムに並べ替えたい場合は、ORDER BY RAND() を使用します。WHERE句で絞り込んだ結果に対してランダムな順序を適用し、LIMIT句と組み合わせることで、指定した件数の行をランダムに取得できます。基本構文select * from DemoTable1559 where yourColumnName IN(yourValue1,yourValue2,....N) order by rand() limit yourLimitValue;サンプルテーブルの作成まずは動作確認用のテーブルを作成しましょう。mysql> create table Dem

  2. MySQLでSELECTクエリを使用してデータを挿入(INSERT)する方法

    MySQLでは、INSERT文とSELECTクエリを組み合わせることで、テーブルにデータを挿入することができます。通常、SELECTは既存のテーブルからデータを取得するために使われますが、値を直接指定してINSERTを実行する際にも活用できる便利な手法です。基本構文SELECTクエリを使用してINSERTを実行する場合の構文は以下の通りです。insert into yourTableName(yourColumnName1,yourColumnName2,yourColumnName3,...N) select yourValue1,yourValue2,yourValue3,......N;