1. 目的
目的の行を早めに見つけ、クエリの処理速度の向上を目的とする。
今回はインデックスの効果を簡易的に確認する。
▪️ DB:MySQL
【用語】
・key:設定したインデックス
・rows:取得される行の見積もり
2. テーブル・データ作成
CREATE TABLE `test` (
`id` int NOT NULL,
`name` text COLLATE utf8mb4_unicode_ci NOT NULL,
`age` int NOT NULL,
`is_manager` int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
データを10000件用意し、idが10000のデータのageは16で登録する。
id | name | age | is_manager |
---|---|---|---|
1 | 山田太郎 | 15 | 1 |
・・・・・・・・・・・
・・・・・・・・・・・
・・・・・・・・・・・
・・・・・・・・・・・
id | name | age | is_manager |
---|---|---|---|
10000 | 山田太郎 | 16 | 1 |
3. データ検索
ageが16のデータを検索する。
EXPLAIN SELECT * FROM test WHERE age = 16;
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | test | NULL | ALL | NULL | NULL | NULL | NULL | 9867 | 10.00 | Using where |
・key:NULL
・rows:9867
4. インデックス設定
インデックスをageカラムに設定する。
CREATE INDEX index_age ON test(age);
5. 再度検索
再度検索する。
EXPLAIN SELECT * FROM test WHERE age = 16;
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | test | NULL | ref | index_age | index_age | 4 | const | 1 | 100.00 | NULL |
・key:index_age
・rows:1
6. 結果
rowsが明らかに減ったことがわかる。
7. インデックスが効かない場合
こちらのサイトで解説してくださっています。
https://qiita.com/MURAMASA2470/items/d06cb3b6ad6b43b12a4b
8. 記事の参考
・EXPLAINについて
https://qiita.com/chii-08/items/e6a3ff51129ef1167ab6
・インデックスについて
https://qiita.com/masayasviel/items/b4f2fe76235f30270b07
https://supersoftware.jp/tech/20240610/19469/