如何优化包含大量内部连接的简单MySQL查询
我发现了,但大多数提示似乎都建议避免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_
内部联接加快简单查询的速度
?我将如何解决下面的问题
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