【发布时间】:2010-10-16 20:38:14
【问题描述】:
我有一个用户表和一个投票表。投票表存储对其他用户的投票。无论好坏,投票表中的一行存储两个用户之间双向的投票。
现在,问题是当我想列出某人投票过的所有人时。
我不是 MySQL 专家,但据我所知,由于 join 语句中的 OR 条件,它需要查看 整个 用户表(目前 +44,000 行),并为此创建一个临时表。
目前,下面的查询大约需要两分钟,是的,两分钟才能完成。如果我删除 OR 条件,以及 join 语句中它之后的所有内容,它会在不到半秒的时间内运行,因为它只需要查看 44,000 个用户行中的大约 17 个(explain ftw! )。
下面的例子,用户 ID 是 9834,我正在尝试获取他/她自己的 no 票,并加入被投票用户的信息看结果。
是否有更好、更快的方法来执行此查询?或者我应该重组表格吗?我非常希望可以通过修改查询来修复它,因为表中已经有很多用户 (+44,000) 和投票 (+130,000),我必须迁移它们。
谢谢:)
SELECT *, votes.id as vote_id
FROM `votes`
LEFT JOIN users ON (
(
votes.user_id_1 = 9834
AND
users.uid = votes.user_id_2
)
OR
(
votes.user_id_2 = 9834
AND
users.uid = votes.user_id_1
)
)
WHERE (
(
votes.user_id_1 = 9834
AND
votes.vote_1 = 0
)
OR
(
votes.user_id_2 = 9834
AND
votes.vote_2 = 0
)
)
ORDER BY votes.updated_at DESC
LIMIT 0, 10
【问题讨论】:
标签: mysql database performance join temp-tables