我有三张桌子:
Table couples consist of save_id, id_candidate_red, id_candidate_blue
Table candidates_red consist of save_id, id_candidate, enter_match
Table candidates_blue consist of save_id, id_candidate, enter_match我正在运行查询
SELECT *
FROM couples as c
LEFT JOIN candidates_blue as cb
ON cb.save_id = 3
AND cb.user_id = c.id_candidate_blue
LEFT JOIN candidates_red as cr
ON cr.save_id = 3
AND cr.user_id = c.id_candidate_red
WHERE c.save_id = 3
AND cb.enter_match = 1
AND cr.enter_match = 1 …这在我看来相当简单,但由于我的表后面有一个大数据集,执行起来需要相当长的时间。
发布于 2015-09-04 00:05:56
恐怕我们对这类问题无能为力。没有什么明显的错误。您可能需要运行查询分析器并添加一些缺少的索引和键。无论如何,仍然有一个改进的机会,尽管没有多少性能上的.
选择*
你真的需要每个专栏吗?即使有了适当的键/索引,这通常也会强制进行表格扫描。只显式地声明您需要返回的字段。它将导致较少的I/O,并可能将扫描操作转换为查找。如果没有,则需要找到要添加的缺失索引。
接下来您可以做的就是删除复制。
左加入candidates_blue为cb,cb.save_id =3,cb.user_id = c.id_candidate_blue,candidates_red为cr,cr.save_id =3,cr.user_id = c.id_candidate_red,其中c.save_id =3,cb.enter_match =1,cr.enter_match =1
我想您添加了所有的save_id = 3s试图加快查询?别费神。不会有帮助的。为couples表指定一次就足够了。这实际上给我带来了一个优化。您的查询等同于使用INNER JOIN,但没有任何好处。您目前并没有得到不匹配的记录,所以您最好还是切换。您可能会看到显著的性能提高。
SELECT * /* don't forget to specify the fields you actually want */
FROM couples as c
INNER JOIN candidates_blue as cb
ON cb.user_id = c.id_candidate_blue
INNER JOIN candidates_red as cr
ON cr.user_id = c.id_candidate_red
WHERE c.save_id = 3
AND cb.enter_match = 1
AND cr.enter_match = 1 最后一件事:非常好的格式!这对眼睛来说非常容易。
https://codereview.stackexchange.com/questions/102719
复制相似问题