MySQLのEXPLAINコマンドでクエリの実行計画を確認する方法
MySQLのEXPLAINコマンドとは
MySQLのEXPLAINは、クエリがどのように実行されるかを示す「実行計画」を表示するためのコマンドです。SELECT、INSERT、DELETE、REPLACE、UPDATEなど、さまざまなステートメントの先頭に付けて利用できます。
データベースのパフォーマンスを低下させる原因のひとつが「フルテーブルスキャン」です。これを防ぐには、適切にインデックスを設定することが重要になります。ここでは、実際にテーブルを作成し、インデックスを追加して、EXPLAINで実行計画を確認する一連の手順を見ていきましょう。
1. テーブルを作成する
まず、サンプル用のテーブルを作成します。
mysql> create table DemoTable1488
-> (
-> StudentId int,
-> StudentName varchar(20),
-> StudentAge int
-> );
Query OK, 0 rows affected (2.18 sec)
2. インデックスを作成する
次に、StudentId列に対してインデックスを作成します。フルテーブルスキャンを避けるために欠かせない作業です。
mysql> create index student_id_index on DemoTable1488(StudentId); Query OK, 0 rows affected (0.90 sec) Records: 0 Duplicates: 0 Warnings: 0
3. レコードを挿入する
INSERT文を使って、テーブルにいくつかのレコードを追加します。
mysql> insert into DemoTable1488 values(101,'Sam',21); Query OK, 1 row affected (0.32 sec) mysql> insert into DemoTable1488 values(102,'Bob',23); Query OK, 1 row affected (0.23 sec) mysql> insert into DemoTable1488 values(103,'David',20); Query OK, 1 row affected (0.21 sec)
4. レコードを表示する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable1488;
実行結果は以下の通りです。
+-----------+-------------+------------+ | StudentId | StudentName | StudentAge | +-----------+-------------+------------+ | 101 | Sam | 21 | | 102 | Bob | 23 | | 103 | David | 20 | +-----------+-------------+------------+ 3 rows in set (0.00 sec)
5. EXPLAINで実行計画を確認する
それでは、SELECT文の先頭にEXPLAINを付けて実行してみます。
mysql> explain select * from DemoTable1488 where StudentId=1;
実行結果は以下の通りです。
+----+-------------+---------------+------------+------+------------------+------------------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------------+------------+------+------------------+------------------+---------+-------+------+----------+-------+ | 1 | SIMPLE | DemoTable1488 | NULL | ref | student_id_index | student_id_index | 5 | const | 1 | 100.00 | NULL | +----+-------------+---------------+------------+------+------------------+------------------+---------+-------+------+----------+-------+ 1 row in set, 1 warning (0.00 sec)
実行計画の主な出力項目の見方
- type: 「ref」と表示されていればインデックスが使用されていることを意味します。「ALL」の場合はフルテーブルスキャンが発生しているサインです。
- possible_keys: 利用候補となり得るインデックスの一覧です。
- key: 実際に使用されたインデックス。この例では「student_id_index」が使われています。
- rows: 調査が必要と推定される行数です。数値が小さいほど効率的です。
- filtered: 条件によって絞り込まれる行の割合(%)です。
このようにEXPLAINを活用することで、クエリがインデックスを正しく利用しているかどうかを事前に確認できます。動作の遅いクエリのボトルネック特定やチューニングを行う際の強力なツールとなるので、ぜひ日常的な開発や運用で活用してください。
-
JavaScriptのthisキーワードとは?参照先のオブジェクトをわかりやすく解説
JavaScriptのthisキーワードは、そのキーワードが属しているオブジェクトを参照します。大きな特徴として、使用される文脈によって参照先が変化するという点があり、これがthisの挙動を理解するうえで重要なポイントとなります。 thisが参照するオブジェクトの一覧 単独で使用した場合、または通常の関数内: グローバルオブジェクト(ブラウザ環境では window オブジェクト)を参照します。 オブジェクトのメソッド内: そのメソッドを所有するオブジェクト自身を参照します。 イベントリスナー内: イベントを受け取ったHTML要素を参照します。 サンプルコード 以下は、JavaScriptの
-
PythonとMySQLでSELECT DISTINCTを使う方法をわかりやすく解説
SQLのテーブルでは、カラムに重複した値が含まれていることがよくあります。重複した値が多いと、クエリが返す結果の分析が難しくなるため、テーブルのカラムから一意(重複なし)の値だけを取得したいケースがあります。 SELECT DISTINCTが必要になる場面 例えば、「Customers」という顧客情報(名前、年齢、国など)を管理するテーブルがあるとします。顧客がどの国に属しているのかを把握したい場合、インド出身の顧客が10人、アメリカ出身が15人といったように、同じ国の値が何度も現れます。 単純にcountryカラムを選択すると、大量の重複値を含む列全体が返されてしまい、結果の分析が困難にな