1
我有什么看起来像一个相当简单的表结构,但MySQL是一个简单的查询默认为不到最佳index_merge
。为什么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;
EXPLAIN一个基本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_id
和object_id
?
这很好用。感谢您的解释。 – 2013-04-29 21:43:38
性能不好吗?我是否使用个别索引进行合成? – Toleo 2018-02-10 17:12:59
@toleo,在这样一个简单的查询中,mysql可以猜测它可以合并索引并使用它们,但更常见的是它没有,并且最好具有所需列的良好索引。性能取决于许多因素。一个索引允许RDBMS遍历整个数据的一个排序后的较小的子集,通常速度较快,但索引消耗内存,这可能会影响其他方面的性能。 – newtover 2018-02-10 19:31:10