我有一个InnoDB MYSQL表,它存储一个多选名称(或表中调用的'code'),一个父对象的id(parent_id)以及在多选(name_id)中选择的选项的名称: / p>
CREATE TABLE IF NOT EXISTS `v2_CA_venue_option_map` (
`map_id` int(11) NOT NULL auto_increment,
`code` varchar(30) NOT NULL,
`parent_id` int(11) NOT NULL,
`name_id` int(11) NOT NULL,
PRIMARY KEY (`map_id`),
UNIQUE KEY `3way_unique` (`code`,`parent_id`,`name_id`),
KEY `name_id` (`name_id`),
KEY `filter` (`code`,`name_id`),
KEY `parent_id` (`parent_id`),
KEY `code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=875156 ;
和一个存储名称的简单表(我想我会显示这个,因为它在查询中使用):
CREATE TABLE IF NOT EXISTS `v2_CA_venue_option_name` (
`name_id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`name_id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Venue Option Names' AUTO_INCREMENT=60 ;
我想针对以下查询进行优化:
SELECT DISTINCT name_id, name
FROM `v2_CA_venue_option_map`
JOIN `v2_CA_venue_option_name`
USING (name_id)
WHERE code = "a_event_types"
此查询需要大约600毫秒才能执行,我想知道:
以下是对上述查询的解释。
更新,我删除了第二个问题。
更新,似乎加快这种速度的最好方法是将输出存储在一个单独的表中,然后从那时开始调用该表,因为这个表只是不能足够快地执行查询我的需求和索引似乎对此DISTINCT查询没有帮助。
答案 0 :(得分:0)
尝试一个懒惰的group by
而不是不同的,这是mysql不必担心的一个列。
SELECT name_id, name
FROM `v2_CA_venue_option_map`
JOIN `v2_CA_venue_option_name`
USING (name_id)
WHERE code = "a_event_types"
GROUP BY name_id
答案 1 :(得分:0)
您可以尝试使用EXISTS
将查询从联接更改为半联接。无需DISTINCT
:
SELECT name_id
, name
FROM v2_CA_venue_option_name AS n
WHERE EXISTS
( SELECT *
FROM v2_CA_venue_option_map AS m
WHERE m.name_id = n.name_id
AND m.code = 'a_event_types'
)