1

MySQL の enum フィールドに問題があります。SELECT * FROM test WHERE t IN ('new') 値を 1 つだけ使用する場合はすべて問題ありませんが、複数の値を使用する場合は SELECT * FROM test WHERE t IN ('new','deleted') MySQL は機能しません。インデックスをまったく使用しないため、このクエリのパフォーマンスは非常に低くなります。それで何かできることはありますか?

CREATE TABLE `test` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`t` ENUM('new','active','deleted') NOT NULL,
PRIMARY KEY (`id`),
INDEX `t` (`t`)
)
ENGINE=MyISAM;


INSERT INTO test SET t = 'new';
INSERT INTO test SET t = 'new';
INSERT INTO test SET t = 'active';
INSERT INTO test SET t = 'active';
INSERT INTO test SET t = 'deleted';
INSERT INTO test SET t = 'deleted';


EXPLAIN SELECT * FROM test WHERE t IN ('new');
id|select_type|table|type|possible_keys|key|key_len|ref  |rows|Extra
1 |SIMPLE     |test |ref |t            |t  |1      |const|2   |Using index condition

EXPLAIN SELECT * FROM test WHERE t IN ('new','deleted');
id|select_type|table|type|possible_keys|key |key_len|ref |rows|Extra
1 |SIMPLE     |test |ALL |t            |NULL|NULL   |NULL|6    |Using where
4

1 に答える 1

1

2 番目のケースで MySQL がインデックスを使用していないという事実は、パフォーマンスが低下することを意味するわけではありません (そうである可能性はありますが)。インデックスの違いはあまり大きくないため、クエリ オプティマイザは、インデックスを 2 回 (値ごとに 1 回) スキャンしてから、選択したインデックスごとに行を読み取るよりも、テーブルをスキャンして、行を直接選択します。

このようなインデックスを有効にするには、通常、多くの TLC (Tender Loving Care)が必要です。詳しくはこちらをご覧ください。

于 2013-01-23T11:50:43.510 に答える