複数カラムクエリ用の複合インデックスを追加する
このステップでは、MySQL で複合インデックスを作成する方法を学びます。複合インデックスは、テーブル内の 2 つ以上のカラムに対するインデックスです。これは、複数のカラムに基づいてデータをフィルタリングするクエリのパフォーマンスを大幅に向上させることができます。
複合インデックスとは?
複合インデックスは、複数のカラムをカバーするインデックスです。クエリで WHERE 句に複数のカラムが頻繁に使用される場合に役立ちます。複合インデックス内のカラムの順序は重要です。クエリの WHERE 句でカラムが同じ順序で指定されている場合に、インデックスは最も効果的です。
users テーブルに、さまざまな都市を含むデータをさらに追加しましょう。
INSERT INTO users (username, email, city) VALUES
('alice_brown', 'alice.brown@example.com', 'Los Angeles'),
('bob_davis', 'bob.davis@example.com', 'Chicago'),
('charlie_wilson', 'charlie.wilson@example.com', 'New York'),
('david_garcia', 'david.garcia@example.com', 'Los Angeles');
複合インデックスの作成
例えば、city と username の両方でユーザーをフィルタリングするクエリを頻繁に実行するとします。この場合、city および username カラムに複合インデックスを作成できます。
CREATE INDEX idx_city_username ON users (city, username);
このステートメントは、users テーブルの city および username カラムに idx_city_username という名前のインデックスを作成します。
インデックスの検証
SHOW INDEXES コマンドを使用して、インデックスが作成されたことを確認できます。
SHOW INDEXES FROM users;
出力には、users テーブルのインデックスの詳細が表示され、作成したばかりの idx_city_username インデックスも含まれます。idx_city_username に対して、city カラム用と username カラム用の 2 つの行が表示されるはずです。
+-------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Ignored |
+-------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| users | 0 | PRIMARY | 1 | id | A | 7 | NULL | NULL | | BTREE | | | NO |
| users | 1 | idx_username | 1 | username | A | 7 | NULL | NULL | | BTREE | | | NO |
| users | 1 | idx_city_username | 1 | city | A | 7 | NULL | NULL | YES | BTREE | | | NO |
| users | 1 | idx_city_username | 2 | username | A | 7 | NULL | NULL | | BTREE | | | NO |
+-------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
複合インデックスの使用
複合インデックスの利点を確認するために、EXPLAIN コマンドを使用して、WHERE 句で city と username の両方のカラムを使用するクエリを分析できます。
EXPLAIN SELECT * FROM users WHERE city = 'New York' AND username = 'charlie_wilson';
EXPLAIN の出力は、クエリが idx_city_username インデックスを使用していることを示します。これは、データベースがテーブル全体をスキャンすることなく、一致する行を迅速に見つけることができることを意味します。出力の possible_keys および key カラムを確認してください。インデックスが使用されている場合、これらのカラムに idx_city_username が表示されます。
+------+-------------+-------+------+--------------------------------+--------------+---------+-------+------+------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+--------------------------------+--------------+---------+-------+------+------------------------------------+
| 1 | SIMPLE | users | ref | idx_username,idx_city_username | idx_username | 767 | const | 1 | Using index condition; Using where |
+------+-------------+-------+------+--------------------------------+--------------+---------+-------+------+------------------------------------+
インデックス内のカラムの順序
複合インデックス内のカラムの順序は重要です。(city, username) の代わりに (username, city) にインデックスを作成した場合、city でフィルタリングし、次に username でフィルタリングするクエリでは、インデックスの効果が低下します。
例えば、(username, city) にインデックスがあり、次のクエリを実行した場合:
EXPLAIN SELECT * FROM users WHERE city = 'New York' AND username = 'charlie_wilson';
MySQL はインデックスを使用しないか、部分的にしか使用しない可能性があります。なぜなら、city カラムがインデックスの先頭カラムではないからです。