【发布时间】:2014-11-16 23:37:18
【问题描述】:
我的查询最多需要 40 秒才能执行,我想知道如何让它更快......
SELECT rp.`id` as rip,r.`id`,
rl.`id` as rlid, r.`number`, r.`type`,
a.`title` as atitle, a.`id` as aid, more,
more_valid
FROM
`R_l_p` rp INNER JOIN
`Rl` rl ON rp.`rl_id` = rl.`id` INNER JOIN
`R` r ON r.`id` = rl.`r_id` INNER JOIN
`A` a ON a.`id` = r.`a_id`
LEFT JOIN
(SELECT `type`, `v`, `r_id`, COUNT(*) AS more
FROM `R_l`
WHERE `type` = 'stream' AND `v` = 1
GROUP BY `r_id`) stm ON stm.`r_id` = r.`id`
LEFT JOIN
(SELECT `type`, `v`, `r_id`, COUNT(*) AS more_valid
FROM `R_l`
WHERE `type` = 'stream' AND `v` = 0
GROUP BY `r_id`) morelink ON morelink.`r_id` = r.`id`
WHERE rp.`link` = 'dead' AND rl.`type` = 'stream'
ORDER BY rip ASC
LIMIT 0, 1000
+-----+--------------+---------------+---------+-- ------------+-------------+----------+ ---------------+--------+------------- ---------------------------------+
|编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 |
+-----+--------------+---------------+---------+-- ------------+-------------+----------+ ---------------+--------+------------- ---------------------------------+
| 1 |初级 | r |全部 |初级,a_id |空 |空 |空 | 21804 |使用临时的;使用文件排序 |
| 1 |初级 |一个 | eq_ref |初级 |初级 | 4 | db453988339.r.a_id | 1 | |
| 1 |初级 | rl |参考 | PRIMARY,r_id,类型 | r_id | 4 | db453988339.r.id | 1 |使用位置 |
| 1 |初级 |派生2 |全部 |空 |空 |空 |空 | 21077 | |
| 1 |初级 |派生3 |全部 |空 |空 |空 |空 | 1 | |
| 1 |初级 | rp | eq_ref | rl_id | rl_id | 4 | db453988339.rl.id | 1 |使用位置 |
| 3 |派生 |链接 |全部 |类型 |空 |空 |空 | 27580 |使用哪里;使用临时的;使用文件排序 |
| 2 |派生 |链接 |全部 |类型 |空 |空 |空 | 27580 |使用哪里;使用临时的;使用文件排序 |
+-----+--------------+---------------+---------+-- ------------+-------------+----------+ ---------------+--------+------------- ---------------------------------+
谢谢你:)
【问题讨论】:
-
删除这 2 个左连接后查询的执行情况如何?
-
左连接的意义何在?你在任何地方都没有提到他们
-
他使用左侧连接中的 more 和 more_valid 作为 select 子句的结果
-
是 v 列位吗?还是 R_l 表有不同的结果?
-
@Leo,在没有两个左连接(0.04 秒)的情况下它的性能非常好。但我真的需要这些...... FuzzyTree,越来越多的_valid 来自这两个左连接
标签: mysql sql performance join time