0


0

MySQLはクエリにインデックスを使用しませんか?

私はこのテーブルを持っています:

CREATE TABLE `point` (
          `id` INT(11) NOT NULL AUTO_INCREMENT,
          `siteid` INT(11) NOT NULL,
          `lft` INT(11) DEFAULT NULL,
          `rgt` INT(11) DEFAULT NULL,
          `level` SMALLINT(6) DEFAULT NULL,
          PRIMARY KEY  (`id`),
          KEY `point_siteid_site_id` (`siteid`),
          CONSTRAINT `point_siteid_site_id` FOREIGN KEY (`siteid`) REFERENCES `site` (`id`) ON DELETE CASCADE
        ) ENGINE=INNODB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

そして、このクエリ:

SELECT * FROM `point` WHERE siteid = 1;

このEXPLAIN情報は次のようになります。

+----+-------------+-------+------+----------------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys        | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+----------------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | point | ALL  | point_siteid_site_id | NULL | NULL    | NULL |    6 | Using where |
+----+-------------+-------+------+----------------------+------+---------+------+------+-------------+

質問は、クエリがpoint_siteid_site_idインデックスを使用しないのはなぜですか?

2 Answer


2


私はMySQLをあまり使用していませんが、PostgreSQLでは、テーブルのレコード数が少ない場合、インデックスを使用しないことを決定できます。 状況に最適なクエリプランを選択するため、これは問題ではありません。 レコードの数が多い場合、インデックスを使用します。 これは、MySQLの場合と同じかもしれません。

編集:外部キーにインデックスが付けられていますか?


0


これはおそらく、十分なサンプルデータがないか、siteid値のカーディナリティ(多様性)がそれほど大きくないためです。 これらは、オプティマイザーがすべての値を読み取るだけですばやく検出される最も一般的な理由です。