我有一个查询我很久以前建立的一个聊天网站,由于大量的流量,我糟糕的查询设计已经赶上了我。这里我有一个来自我的长查询日志的例子:
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;
查询执行大约需要 15 秒,我也索引了所有参考列。将 1000 "AND user.id<>0" 标记替换为查找临时表会改进查询。我想我会在去改变之前问一下。如果您可以推荐任何有用的代码更改,我将不胜感激。
编辑:“user.id<>23847”标记是通过简单的选择在 php 中创建的,然后是 foreach 数组循环将它们添加到更大的 sql 查询中。
编辑 2:感谢您的所有帮助,通过使用“不在”,他们的查询从 13 秒减少到 0.3 秒。