這與我發佈的另一個問題類似,但我被告知需要拆分它們。加快這個JOIN,MySQL
我有一個InnoDB MYSQL表,它存儲了一個多重選擇名稱(或表中稱之爲「代碼」),一個父對象的id(parent_id)以及在多重選擇(name_id)中選擇的選項名稱:
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 ;
CREATE TABLE IF NOT EXISTS `v2_CA_venues` (
`venue_id` int(11) NOT NULL auto_increment,
`status` char(1) NOT NULL,
`name` varchar(255) NOT NULL,
`url_key` varchar(255) NOT NULL,
`city` varchar(255) NOT NULL,
PRIMARY KEY (`venue_id`),
KEY `city` (`city`,`status`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
,我想以優化以下查詢:
SELECT v.name, v.venue_id, v.url_key
FROM `v2_CA_venue_option_map` map
JOIN `v2_CA_venue_option_map` map2 ON (map2.parent_id = map.parent_id)
JOIN `v2_CA_venue_option_map` map3 ON (map3.parent_id = map.parent_id)
JOIN `v2_CA_venues` v ON (v.venue_id = map.parent_id)
WHERE v.city = 'Nevada City'
AND map3.code = 'a_venue_types'
AND map3.name_id = 19
AND map.code = 'a_event_types'
AND map.name_id = 20
AND map2.code = 'a_event_types'
AND map2.name_id = 3
AND v.status = 'a'
- 索引是否放在桌子上爲這些連接和WHERE提供最佳性能?
- 是否有任何索引無用?
爲上述查詢的解釋:
太謝謝你了!我正在尋找建議,以便從這些表格中獲得最佳表現。
實際上,場地表可能是一個恩人優化查詢...你可以請張貼結構也與它的指標? – DRapp
增加了場地表。 – RonSper