2016-06-10 267 views
0

我有一个相当长的插入查询,该查询从表中选择查询插入数据。问题在于select查询花费太长时间才能执行。该表是MyISAM,并且该选择会锁定影响也使用该表的其他用户的表。我发现查询的问题是一个连接。MySQL(MyISAM)SELECT查询需要花费很长时间加入

当我删除查询的这个部分,它只需花费不到一秒钟执行,但,当我离开这部分查询时间超过15分钟:

LEFT JOIN enq_217 Pex_217 
    ON e.survey_panelId = Pex_217.survey_panelId 
    AND e.survey_respondentId = Pex_217.survey_respondentId 
    AND Pex_217.survey_respondentId != 0 

db.table_1含有5,90,145行和e包含4,703行。

explain输出:

id select_type table type possible_keys key key_len ref rows Extra 
1 PRIMARY e ALL survey_endTime,survey_type NULL NULL NULL 4703 Using where 
1 PRIMARY Pex_217 ref survey_respondentId,idx_table_1 idx_table_1 8 e.survey_panelId,e.survey_respondentId 2 Using index 
2 DEPENDENT SUBQUERY enq_11525_timing eq_ref code code 80 e.code 1 

如何编辑查询,这部分要快?

+0

可以显示EXPLAIN' –

+0

的'输出的总查询16610个字符长..使用'解释你query'并显示输出 –

+0

运行查询 –

回答

1

我建议在表上创建db.table_1索引的字段panelIdrespondentId

+0

添加索引后,查询仍然非常缓慢。 –

0

你想在表上的索引。此逻辑的最佳索引是:

create index idx_table_1 on table_1(panelId, respondentId) 

索引中这两列的顺序应该没有关系。

您可能希望在索引中包含其他列,具体取决于查询的其余部分在做什么。

注意:两列的单个索引不同于每列的两个索引。

+0

我使用了您的查询,但选择查询仍然需要很长时间才能执行,并且会阻止网站上的所有其他用户。 –

0

为什么是LEFT加入?

Pex_217中有多少行?

运行使用的每张桌子上的ANALYZE TABLE。 (这个有时有助于MyISAM;很少需要InnoDB。)

由于'真正的问题'似乎是查询“阻止其他用户”,切换到InnoDB。

Tips on conversion

JOIN不坏(与新索引 - 注意Using index):扫描4703行,然后将手伸入其他表的索引每个约2倍。

也许“依赖子查询”是代价高昂的部分。我们来看看。