私はかなり単純なテーブル構造のように見えますが、MySQL はindex_merge
単純なクエリで最適とは言えないデフォルトを設定しています。
テーブル構造は次のとおりです。
CREATE TABLE IF NOT EXISTS `event_log` (
`event_id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(5) DEFAULT NULL,
`location_id` int(10) DEFAULT NULL,
`object_id` int(5) DEFAULT NULL,
`action_id` int(5) DEFAULT NULL,
`date_event` datetime DEFAULT NULL,
PRIMARY KEY (`event_id`),
KEY `user_id` (`user_id`),
KEY `date_event` (`date_event`),
KEY `action_id` (`action_id`),
KEY `object_id` (`object_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
基本的な SELECT クエリの EXPLAIN
EXPLAIN SELECT date_event
FROM event_log
WHERE user_id =123
AND object_id =456
AND location_id =789
これを返します:
select_type table type possible_keys key key_len ref rows Extra
SIMPLE event_log index_merge user_id,object_id object_id,user_id 5,5 NULL 27 Using intersect(object_id,user_id); Using where
読みやすくするために、エクストラビットを次に示します。
Using intersect(object_id,user_id); Using where
MySQL がこのクエリで標準インデックスを使用しないのはなぜですか? と が交差user_id
しているのはなぜobject_id
ですか?