のは、簡単な例から始めましょう:だから、2列 複数のインデックスからMySQLを読み込みますか?
CREATE TABLE `test` (
`id` INT UNSIGNED NOT NULL,
`value` CHAR(12) NOT NULL,
INDEX (`id`),
INDEX (`value`)
) ENGINE = InnoDB;
、両方のインデックス化。これが意味すると思ったのは、すべてのデータがインデックスに格納されるため、MySQLは実際のテーブルをもう読む必要がないということでした。
mysql> EXPLAIN SELECT id FROM test WHERE id = 1;
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
| 1 | SIMPLE | test | ref | id | id | 4 | const | 1 | Using index |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
"インデックスを使用する"、非常にいいです。私の理解では、これは実際のテーブルからではなく、インデックスからデータを読み込んでいることを意味します。しかし、私が本当に欲しいのは、 "価値"の列です。
mysql> EXPLAIN SELECT value FROM test WHERE id = 1;
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
| 1 | SIMPLE | test | ref | id | id | 4 | const | 1 | |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
「今回はインデックスを使用していません。
両方の列をカバーするインデックスを追加すると役立つと思いました。
ALTER TABLE `test` ADD INDEX `id_value` (`id`,`value`);
これで、以前のselectステートメントをもう一度実行して、新しいインデックスを使用するようにしましょう。
mysql> EXPLAIN SELECT id, value FROM test USE INDEX (id_value) WHERE id = 1;
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
| 1 | SIMPLE | test | ref | id_value | id_value | 4 | const | 1 | Using index |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
賞賛の言葉は、インデックスから読んでいます。
しかし実際には、私は他のもののために結合されたインデックスを実際に必要としません。 2つの別々のインデックスからMySQLを読み取ることは可能ですか?
洞察力があれば幸いです。
編集:もう1つの例です。これは、元のテーブル定義(各カラムのインデックス)を使用しています。
mysql> EXPLAIN SELECT t1.value
-> FROM test AS t1
-> INNER JOIN test AS t2
-> ON t1.id <> t2.id AND t1.value = t2.value
-> WHERE t1.id = 1;
+----+-------------+-------+------+---------------+-------+---------+----------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+-------+---------+----------+------+-------------+
| 1 | SIMPLE | t1 | ref | id,value | id | 4 | const | 1 | |
| 1 | SIMPLE | t2 | ref | value | value | 12 | t1.value | 1 | Using where |
+----+-------------+-------+------+---------------+-------+---------+----------+------+-------------+
これは両方のフィールドが結合条件で使用されているため、必ず両方のインデックスから読み取る必要がありますが、実際には実際のレコードからデータを読み込みます。なぜインデックスから読み込んだデータだけを使うのではないのですか?あるいは、「インデックスを使う」と言っていなくても実際にそのデータを使用していますか?
おかげで再び
最初に選択していないデータにインデックスを作成するのはなぜですか?インデックスは余分なスペースを必要とし、テーブルデータと同様にディスクから読み込まなければなりません(テーブルデータと同様にメモリにキャッシュできます)。 –
私はできるだけシンプルに私の例を作ろうとしました。実際のアプリケーションでは、そこにインデックスを持っている理由があります。私が追加した結合の例は、私が実際にやっていることにもう少し近づき、なぜ「値」列にインデックスがあるのかを説明する必要があります。 – Rapsey