优化长mysql查询

Dav*_*vid 3 mysql sql

我有一个查询我很久以前建立的聊天网站,由于大量的流量我的糟糕的查询设计赶上了我.这里我有一个来自我的长查询日志的例子:

SELECT  DISTINCT user.id 
FROM    user 
        STRAIGHT_JOIN user_pics 
            ON user.id=user_pics.uid      
        STRAIGHT_JOIN user_account 
            ON user_account.user_id=user.id 
WHERE   registered = 1  AND 
        user.id<>0 AND 
        user.id<>23847 AND 
        user.id<>12392... (IT HAS LITERALLY 1000 OF THESE)
        AND user_pics.main=1 AND 
        user_pics.approved=1 AND 
        user_pics.deleted<>1 AND 
        gender LIKE '%female%' AND 
        country LIKE '%United Kingdom%' AND 
        city LIKE '%birmingham%' AND 
        sexorientation     LIKE '%Straight%' 
ORDER   BY updatedate DESC 
LIMIT   20;
Run Code Online (Sandbox Code Playgroud)

查询大约需要15秒才能执行,我也将索引的所有列都编入索引.将查找到临时表替换1000"AND user.id <> 0"标记会改进查询.我想我会先去询问并做出改变.如果您可以通过代码推荐任何有用的更改,我将非常感激.

编辑:"user.id <> 23847"标记是在php中通过简单的select创建的,然后是foreach数组循环,将它们添加到更大的sql查询中.

编辑2:感谢您的所有帮助,通过使用"不在"他们的查询从13秒减少到0.3秒.

Oye*_*eme 5

尝试使用EXPLAIN
http://dev.mysql.com/doc/refman/5.0/en/explain.html
你会看到什么可以更好.

这可以替换为 user.id NOT IN(23847 ,0 , 23847 ,...) 使用NOT IN()

  • 使用说明总是一个好主意 - 我总是建议...... (2认同)