加速MySQL中的DISTINCT查询

时间:2011-09-27 20:56:29

标签: mysql

我有一个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毫秒才能执行,我想知道:

  1. 如果我可以在表上放置一个索引来加速这个不同的查询。
  2. 如何以更好的表现获得相同的结果。
  3. 以下是对上述查询的解释。

    enter image description here

    更新,我删除了第二个问题。

    更新,似乎加快这种速度的最好方法是将输出存储在一个单独的表中,然后从那时开始调用该表,因为这个表只是不能足够快地执行查询我的需求和索引似乎对此DISTINCT查询没有帮助。

2 个答案:

答案 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'
      )