Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优化包含大量内部连接的简单MySQL查询_Mysql_Database_Query Optimization - Fatal编程技术网

如何优化包含大量内部连接的简单MySQL查询

如何优化包含大量内部连接的简单MySQL查询,mysql,database,query-optimization,Mysql,Database,Query Optimization,我发现了,但大多数提示似乎都建议避免MySQL不是为之构建的(例如,计算、验证等)。另一方面,我的查询非常直接,但将许多表连接在一起 有没有一种方法可以通过许多内部联接加快简单查询的速度?我将如何解决下面的问题 SELECT t_one.id FROM table_one t_one INNER JOIN entr_to_state st INNER JOIN entr_to_country ct INNER JOIN entr_to_domain dm INNER JOIN entr_

我发现了,但大多数提示似乎都建议避免MySQL不是为之构建的(例如,计算、验证等)。另一方面,我的查询非常直接,但将许多表连接在一起

有没有一种方法可以通过许多
内部联接加快简单查询的速度
?我将如何解决下面的问题

SELECT t_one.id FROM table_one t_one 
INNER JOIN entr_to_state st 
INNER JOIN entr_to_country ct 
INNER JOIN entr_to_domain dm 
INNER JOIN entr_timing t 
INNER JOIN entr_to_weather a2w 
INNER JOIN entr_to_imp_num a2i 
INNER JOIN entr_collection c 
WHERE t_one.type='normal' 
AND t_one.campaign_id = c.id 
AND t_one.status='running' 
AND c.status='running' 
AND (c.opt_schedule = 'continuous' OR (c.opt_schedule = 'schedulebydate' 
AND (c.start_date <= '2011-03-06 14:25:52' AND c.end_date >= '2011-03-06 14:25:52'))) 
AND t.entr_id = t_one.id AND ct.entr_id = t_one.id 
AND st.entr_id = t_one.id AND a2w.entr_id = t_one.id 
AND (t_one.targeted_gender = 'male' OR t_one.targeted_gender = 'both') 
AND t_one.targeted_min_age <= 23.1 AND t_one.targeted_max_age > 23.1 
AND (ct.abbreviation = 'US' OR ct.abbreviation = 'any') 
AND (st.abbreviation = 'CO' OR st.abbreviation = 'any') 
AND t.sun = 1 AND t.hour_14 = 1 
AND (a2w.weather_category_id = 1 OR a2w.weather_category_id = 0) 
AND t_one.targeted_min_temp <= 46 
AND t_one.targeted_max_temp > 46 GROUP BY t_one.id
从表\u one t\u one中选择t\u one.id
内部连接入口到状态st
内部连接入口至国家/地区ct
内部连接入口到域dm
内连接入口正时t
内部连接入口至入口a2w
内部连接入口到入口编号a2i
内部联接入口集合c
其中t_one.type='normal'
和t_one.campaign_id=c.id
还有,状态为“正在运行”
和c.status='running'
和(c.opt_schedule='continuous'或(c.opt_schedule='schedulebydate'
和(c.开始日期='2011-03-06 14:25:52'))
t.entr_id=t_one.id和ct.entr_id=t_one.id
和st.entr_id=t_one.id和a2w.entr_id=t_one.id
和(目标性别=‘男性’或目标性别=‘两者’)
还有t_one.目标年龄23.1岁
和(ct.缩写='US'或ct.缩写='any')
和(st.缩写='CO'或st.缩写='any')
t.sun=1,t.hour_14=1
和(a2w.weather\u category\u id=1或a2w.weather\u category\u id=0)
和t_one.id指定的t_min_temp 46组

当然,为所有相关字段编制索引,我相信您已经找到了

然后通过运行
EXPLAIN SELECT…

考虑将它们拆分为一个单独的查询,即缩小要查找的记录的范围,然后对这些记录而不是所有记录执行联接

i、 e


当然,为所有相关字段编制索引,我相信您已经做到了

然后通过运行
EXPLAIN SELECT…

考虑将它们拆分为一个单独的查询,即缩小要查找的记录的范围,然后对这些记录而不是所有记录执行联接

i、 e


您需要解释如何选择查询,检查查询的哪些部分没有在索引中使用,然后尝试为这些部分编制索引。如果可能,也可以将查询分解为更小的部分


如果您真的无法以任何方式优化底层数据库或查询,那么您可以求助于具有快速访问所需数据的平面表。然后连接主查询以更新平面表,以便根据需要经常运行。

您需要解释选择查询,检查查询的哪些部分未在索引中使用,然后尝试索引这些部分。如果可能,也可以将查询分解为更小的部分


如果您真的无法以任何方式优化底层数据库或查询,那么您可以求助于具有快速访问所需数据的平面表。然后连接主查询以更新平面表,以便根据需要经常运行。

这对我来说很有效!我有一个超过200万条记录的大型主表(a),4个主联接表(a、b、c、d)和一个辅助联接表(aa)。关系看起来像:
A->A->ba->ca->ca->d->aa所有键和表都被索引,并且ORDERBY子句位于主表(A)上。如果没有限制,查询大约需要400毫秒。有了限制,180000毫秒:(这对我来说很有用!我有一个超过200万条记录的大型主表(a),4个主联接表(a、b、c、d)和一个辅助联接表(aa)。关系看起来像:
a->a->b a->c a->d->aa所有键和表都被索引,order by子句在主表(a)上.没有限制时,查询大约需要400毫秒。有限制时,180000毫秒:(
SELECT c.*, ....
FROM (SELECT x, y, z .... ) AS c