我可以用任何方式优化这个SQL语句吗?

时间:2014-03-04 04:40:10

标签: mysql sql optimization query-optimization

所以我的查询确实有效,但完成时间大约需要25-30秒。我想知道是否有任何我可以用这个查询来优化它以便它可以运行得更快一点?我自己做了一些,但它最多只运行25秒。

有任何建议或帮助吗?即使是正确方向上的一点也不仅仅是值得赞赏的。

    SELECT * FROM `earnfrom` WHERE (
            `active` = ? AND `type` = ?
    )
    AND `curdaily` <= `dailyclick` AND `clicks` <= `totalclick` AND `id` NOT IN (
        SELECT `earnid` FROM `earnedby` WHERE `userid`= ?
    )
    AND `userid` != ? AND  (
        SELECT `points` FROM `users` WHERE `id` = `userid`
    ) >= `cpc` ORDER BY `cpc` DESC, RAND()")

以下是表格方案:

表赚钱: earnedby

表赚取: earnfrom

TABLE用户: prntscr.com/2xpmre

DB有2711个相同类型的链接(Facebook喜欢),它需要得到那些没有被喜欢的人(NOT IN(SELECT * FROM` ....)但是NOT IN正在制造一个痛苦,因为一周(因为我每天收到超过210个用户)

所以查询应该这样做:

从数据库中选择一个链接,验证每日限制点击是否相等,选择那些不相等的人,验证另一个表(被比为)中id是否存在为earnid,如果不存在则应该是好的,如果它存在则意味着它实际上已经被喜欢,或者当likin

时出现问题

感谢您考虑我的问题〜

2 个答案:

答案 0 :(得分:0)

我不是MySQL专家,因此我使用Percona Query Adviser在实施之前分析我的查询。这是一个很好的起点。

https://tools.percona.com/query-advisor/

答案 1 :(得分:0)

将子查询从WHERE部分移动到具有适当连接的FROM部分。

E.g。像这样

SELECT * FROM `earnfrom` 
    join `users` on `users`.`id` = `earnfrom`.`userid` 
    left join (select `earnid` from FROM `earnedby` WHERE `userid`= ?) sub ON sub.`earnid`=`earnfrom`.`userid`
WHERE (
        `active` = ? AND `type` = ?
)
AND `curdaily` <= `dailyclick` 
AND `clicks` <= `totalclick` 
AND sub.`earnid` is NULL
AND `userid` != ? AND  `users`.`points` >= `cpc` 
ORDER BY `cpc` DESC, RAND()")