首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加入情侣、红候选人和蓝候选人

加入情侣、红候选人和蓝候选人
EN

Code Review用户
提问于 2015-09-03 20:21:02
回答 1查看 41关注 0票数 3

我有三张桌子:

代码语言:javascript
复制
    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

我正在运行查询

代码语言:javascript
复制
 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 

…这在我看来相当简单,但由于我的表后面有一个大数据集,执行起来需要相当长的时间。

EN

回答 1

Code Review用户

回答已采纳

发布于 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,但没有任何好处。您目前并没有得到不匹配的记录,所以您最好还是切换。您可能会看到显著的性能提高。

代码语言:javascript
复制
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 

最后一件事:非常好的格式!这对眼睛来说非常容易。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/102719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档