为什么MySQL在这个查询中显示index_merge?

时间:2013-04-29 16:19:19

标签: mysql indexing query-optimization explain

我看起来像一个相当简单的表结构,但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 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_idobject_id相交?

1 个答案:

答案 0 :(得分:8)

查询的最有效索引是包含所有三个字段的复合索引,例如:(object_id, user_id, location_id)。由于没有这样的索引,MySQL尽力从现有索引中获取大部分信息。