MySQLのEXPLAINキーワードでクエリ情報を取得する方法
MySQLのEXPLAINキーワードとは
MySQLのEXPLAINキーワードを使用すると、SELECT文がどのように実行されるか(実行計画)を確認できます。インデックスが適切に使われているか、何行のスキャンが必要かといった情報を取得できるため、クエリのパフォーマンスチューニングに欠かせない機能です。
ここでは、テーブルの作成からインデックスの設定、EXPLAINによる実行計画の確認までを具体的な手順とともに解説します。
1. テーブルの作成
まず、以下のクエリでサンプル用のテーブルを作成します。
mysql> create table DemoTable1541
-> (
-> EmployeeId int,
-> EmployeeFirstName varchar(20) NOT NULL
-> );
Query OK, 0 rows affected (0.94 sec)
2. インデックスの作成
次に、EmployeeFirstNameカラムに対してインデックスを作成します。これにより、名前での検索が高速化されます。
mysql> create index emp_name_index on DemoTable1541(EmployeeFirstName);
Query OK, 0 rows affected (0.75 sec)
Records: 0 Duplicates: 0 Warnings: 0
3. レコードの挿入
INSERTコマンドを使って、テーブルにいくつかのレコードを追加します。
mysql> insert into DemoTable1541 values(1,'Robert');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1541 values(2,'Adam');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1541 values(3,'Mike');
Query OK, 1 row affected (0.14 sec)
4. 登録データの確認
SELECT文でテーブル内のすべてのレコードを表示してみましょう。
mysql> select * from DemoTable1541;
以下のような出力が得られます。
+------------+-------------------+
| EmployeeId | EmployeeFirstName |
+------------+-------------------+
| 1 | Robert |
| 2 | Adam |
| 3 | Mike |
+------------+-------------------+
3 rows in set (0.00 sec)
5. EXPLAINで実行計画を確認
続いて、EXPLAINキーワードを使い、WHERE句でEmployeeFirstNameを検索するクエリの実行計画を取得します。
mysql> explain select * from DemoTable1541 where EmployeeFirstName='Mike';
実行結果は以下の通りです。
+----+-------------+---------------+------------+------+----------------+----------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------------+------------+------+----------------+----------------+---------+-------+------+----------+-------+
| 1 | SIMPLE | DemoTable1541 | NULL | ref | emp_name_index | emp_name_index | 62 | const | 1 | 100.00 | NULL |
+----+-------------+---------------+------------+------+----------------+----------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
実行結果のポイント
この出力から、次のことが読み取れます。
- type: ref … インデックスを使った等価検索が行われており、効率的なアクセス方式です。
- possible_keys / key: emp_name_index … 作成したインデックスが候補に挙がり、実際に使用されています。
- rows: 1 … スキャン対象はわずか1行のみで、フルテーブルスキャンを回避できています。
このようにEXPLAINを活用すれば、クエリがインデックスを正しく利用しているかどうかを簡単に検証でき、遅いクエリの改善にも役立ちます。
-
MySQLでランダムな行を取得する方法|ORDER BY RAND()を使った抽出テクニック
MySQLでランダムな行を取得する基本MySQLでランダムに行を取得したい場合、最も手軽な方法は ORDER BY RAND() を使うことです。この記事では、カンマ区切りの値を格納したデータを例に、特定の値を除外しながらランダムに行を抽出する方法をステップごとに解説します。1. サンプルテーブルを作成するまず、IDのリストを保存するためのシンプルなテーブルを作成します。mysql> create table DemoTable1835 ( ListOfIds varchar(20) &
-
ApacheとMySQLを連携させる方法|ユーザー認証とログ管理の基本
ApacheとMySQLの連携とは本記事では、Webサーバー「Apache」とデータベース「MySQL」を組み合わせて活用する方法を解説します。Apacheは、Apache Software Foundationによって開発・保守されているWebサーバーソフトウェアです。ユーザーからWebページへのアクセス要求(リクエスト)を受け付け、いくつかのセキュリティチェックを実施したうえで、目的のページへとユーザーを誘導します。MySQLによるユーザー認証MySQLデータベースを使ってユーザー認証を行えるプログラムは数多く存在します。これらのプログラムを利用すれば、アクセスログをMySQLのテーブルに