Mysql 3表连接-优化建议?

Mysql 3表连接-优化建议?,mysql,join,Mysql,Join,对于MySQL查询来说,除了简单的插入和选择,这是一个新的概念,所以如果这看起来非常基本,我提前道歉 我有一个具有一些多对多关系的数据库,我正在尝试跨3个表构建一个连接查询。这是我尝试编写的第一个大表/大查询,因此我将按照我阅读的教程进行操作。查询返回所有正确的值,但是,在本地主机上,平均运行时间似乎相当慢,为.25秒,但峰值约为.7秒 我想知道是否有人对如何提高效率有什么建议?我也使用了一些新的索引,这些索引似乎没有什么可测量的效果——这里的实时杀手似乎是ORDER BY语句。不幸的是,尽管拖

对于MySQL查询来说,除了简单的插入和选择,这是一个新的概念,所以如果这看起来非常基本,我提前道歉

我有一个具有一些多对多关系的数据库,我正在尝试跨3个表构建一个连接查询。这是我尝试编写的第一个大表/大查询,因此我将按照我阅读的教程进行操作。查询返回所有正确的值,但是,在本地主机上,平均运行时间似乎相当慢,为.25秒,但峰值约为.7秒

我想知道是否有人对如何提高效率有什么建议?我也使用了一些新的索引,这些索引似乎没有什么可测量的效果——这里的实时杀手似乎是ORDER BY语句。不幸的是,尽管拖网捕捞堆栈溢出并尝试了很多方法,但我还是无法对其进行优化

这就是问题所在:

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

尝试在c_designer2type表的cc_id上添加索引,当前查询必须扫描整个表几次才能进行连接

另外,可能值得考虑在cs_id上建立一个索引,因为这是您的主要选择标准,在当前设置中,将检查“collection”表中的每一行是否匹配。只有当“cs_id”的值数量合理时,才值得这样做。如果你只有1,2和3,那就不值得了