前提
first_nameとlast_nameを1つとしてインデックスを作成しています。
sql
1CREATE TABLE `users` ( 2 `id` INT(11) NOT NULL AUTO_INCREMENT, 3 `first_name` VARCHAR(16) NOT NULL COLLATE 'utf8_general_ci', 4 `last_name` VARCHAR(16) NOT NULL COLLATE 'utf8_general_ci', 5 `age` INT(11) NOT NULL, 6 PRIMARY KEY (`id`) USING BTREE, 7 INDEX `first_name_last_name` (`first_name`, `last_name`) USING BTREE 8) 9COLLATE='utf8_general_ci' 10ENGINE=InnoDB 11AUTO_INCREMENT=1; 12 13 14INSERT INTO `feed_router`.`users` (`id`, `first_name`, `last_name`, `age`) VALUES ('1', 'tarou1', 'tanaka', '1'); 15INSERT INTO `feed_router`.`users` (`id`, `first_name`, `last_name`, `age`) VALUES ('2', 'tarou2', 'tanaka', '2'); 16INSERT INTO `feed_router`.`users` (`id`, `first_name`, `last_name`, `age`) VALUES ('3', 'tarou3', 'tanaka', '3'); 17
聞きたいこと
SQL1はwhere句でfirst_name, last_nameを指定しているので作成済みのインデックスの通りindexが利用されています。
SQL2はwhere句でfirst_nameのみを指定しているのですがpossible_keysがあるのでindexが利用されているように見ます。
Q1. 複合インデックスを作っている場合、where句で1つだけを指定してもインデックスが効きますか?
(B木で作成されるインデックスは複数列専用では無く、1つだけの場合も考慮された構造になっているのでしょうか?)
Q2. 複合インデックスがあるところに対して更に1つだけのインデックスを作る必要はありますか?
SQL1
SQL
1select * from users where first_name = 'tarou1' and last_name = 'tanaka' 2explain select * from users where first_name = 'tarou1' and last_name = 'tanaka' 3(explain結果省略)
SQL2
SQL
1select * from users where first_name = 'tarou1' 2explain select * from users where first_name = 'tarou1'
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | users | ref | first_name_last_name | first_name_last_name | 50 | const | 1 | Using index condition |
補足情報(FW/ツールのバージョンなど)
- 10.2.12-MariaDB
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/11 16:49 編集
2020/08/11 16:51 編集
2020/08/12 00:11 編集
2020/08/13 04:19
2020/08/13 04:29
2020/08/20 01:23