3表加入 - 优化建议?

时间:2011-11-02 10:12:32

标签: mysql join

除了简单的插入和选择之外的MySQL查询相当新,所以如果这看起来完全基本我提前道歉。

我有一个包含一些多对多关系的数据库,并且正在尝试跨3个表构建JOIN查询。这是我尝试编写的第一个大表/大查询,所以按照我阅读的教程进行操作。查询返回所有正确的值,但是,似乎运行得相当慢(平均.25秒,但在本地主机上达到.7)。

我想知道是否有人对如何提高效率有任何建议?我已经玩过索引(那些也是新的)并且似乎没有什么可测量的效果 - 这里的实时杀手似乎是ORDER BY语句。不幸的是,尽管在Stack Overflow上进行了搜索并尝试了大量的东西,但我无法理解这些优势。

这是关注的问题:

SELECT a.d_id, cs_id, blg_id, d_name, d_slug, ct_id, a.cc_id
FROM collection a
JOIN designers b
ON a.d_id = b.d_id
JOIN designer2type c
ON a.cc_id = c.cc_id
WHERE cs_id = '3'
ORDER BY d_name, ct_id ASC

我已经尝试了一些替代方案(复制了一些关于子查询的教程,这些教程需要花费更长的时间才能运行,而且以下的平均值相似,但最大值更高:

SELECT collection.d_id, cs_id, blg_id, d_name, d_slug, collection.cc_id, c_url FROM collection, designers, c_image WHERE cs_id = '3' AND c_image.ci_id = collection.ci_id AND collection.d_id = designers.d_id ORDER BY d_name ASC

这是与||的解释表示分栏符:

id || select_type || table || type || possible_keys || key || key_len || ref || rows || Extra
1 || SIMPLE || a || ref || PRIMARY,d_id,cs_id || cs_id || 4 || const || 8403 || Using temporary; Using filesort
1 || SIMPLE || b || eq_ref || PRIMARY || PRIMARY || 4 || test.a.d_id || 1    
1 || SIMPLE || c || ref || cc_id || cc_id || 4 || test.a.cc_id || 1  

这些是表结构:

CREATE TABLE `collection` (
`cc_id` int(8) NOT NULL AUTO_INCREMENT,
`d_id` int(4) NOT NULL,
`cs_id` int(3) NOT NULL,
`cfw_id` int(2) NOT NULL,
`c_id` int(8) NOT NULL,
`ci_id` int(8) NOT NULL,
`cg_id` int(1) NOT NULL,
`blg_id` bigint(20) NOT NULL,
PRIMARY KEY (`cc_id`),
KEY `d_id` (`d_id`),
KEY `cs_id` (`cs_id`),
KEY `cfw_id` (`cfw_id`),
KEY `c_id` (`c_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

CREATE TABLE `designers` (
`d_id` int(4) NOT NULL AUTO_INCREMENT,
`d_name` varchar(100) NOT NULL,
`d_slug` varchar(100) NOT NULL,
PRIMARY KEY (`d_id`),
KEY `d_name` (`d_name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=52782 ;

CREATE TABLE `c_designer2type` (
`cd2t_id` int(8) NOT NULL AUTO_INCREMENT,
`cc_id` int(8) NOT NULL,
`ct_id` int(2) NOT NULL,
`cd2t_desc` text NOT NULL,
PRIMARY KEY (`cd2t_id`),
KEY `cc_id` (`cc_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=57545 ;

我不确定这是查询问题,索引问题还是表结构问题。或者根本不是一个问题,虽然在没有其他负载的情况下在本地主机上接近一秒钟而且只有中等数量的行似乎很高。无论哪种方式,该项目都没有使用,因此如果需要可以更改任何内容。

如果有人对我在这个任务中可能出错的地方有任何想法/建议,我们将不胜感激:)

谢谢,Tania

1 个答案:

答案 0 :(得分:0)

尝试在c_designer2type表的“cc_id”上添加索引,当前查询必须多次扫描整个表以进行连接。

同样值得考虑“cs_id”的索引,因为这是您的主要选择标准,在当前设置中,检查“集合”表中的每一行是否匹配。如果'cs_id'的值有合理数量,那么这是值得做的。如果你只有1,2& 3它不值得。

相关问题