MyISAM テーブルに MySQL の数百万のレコードを含むテーブルがあります。非常に単純化すると、次のようになります。
CREATE TABLE `test` (
`text` varchar(5) DEFAULT NULL,
`number` int(5) DEFAULT NULL,
KEY `number` (`number`) USING BTREE,
KEY `text_number` (`text`,`number`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
次のデータが入力されます。
INSERT INTO `test` VALUES ('abcd', '1');
INSERT INTO `test` VALUES ('abcd', '2');
INSERT INTO `test` VALUES ('abcd', '3');
INSERT INTO `test` VALUES ('abcd', '4');
INSERT INTO `test` VALUES ('bbbb', '1');
INSERT INTO `test` VALUES ('bbbb', '2');
INSERT INTO `test` VALUES ('bbbb', '3');
次のクエリを実行すると:
EXPLAIN SELECT * FROM `test` WHERE (`text` = 'bbbb' AND `number` = 2)
使用するキーとして 'number' を返します。しかし、次のクエリ:
EXPLAIN SELECT * FROM `test` WHERE (`text` = 'bbbb' AND `number` = 1)
使用するキーとして「text_number」を返します。これは、この結合されたキーが WHERE の 2 つの列と正確に一致するため、より理にかなっています。これらの量のレコードではパフォーマンスは問題になりませんが、数百万のレコードでは、'text' インデックスを使用するクエリは 4 秒かかり、'text_number' インデックスを使用するクエリは数ミリ秒で終了します。
これについて論理的な説明はありますか?MySQL が使用するインデックスを変更するにはどうすればよいですか? USE INDEX を使用できることはわかっていますが、MySQL がクエリを実行するための最適なプランを見つけられるようにしたいと考えています。これは MySQL 5.1 と 5.5 で同じ結果です。