jim*_*meh 3 mysql database performance join temp-tables
我有一张用户表和一张投票表.投票表存储对其他用户的投票.无论好坏,投票表中的一行,都会在两个用户之间的两个方向上存储投票.
现在,问题在于我想列出一些人投票的所有人.
我不是MySQL的专家,但是根据我的想法,由于join语句中的OR条件,它需要查看整个 users表(目前是+44,000行),并创建一个临时表来做所以.
目前,bellow查询大约需要两分钟,是的,两分钟即可完成.如果我在join语句中删除OR条件及其后面的所有内容,它会在不到半秒的时间内运行,因为它只需要查看44,000个用户行中的大约17个(解释 ftw!).
下面的示例,用户ID是9834,我正在尝试获取他/她自己没有投票,并加入投票的用户的信息到结果.
是否有更好,更快的方法来执行此查询?或者我应该重组表格?我真的希望可以通过修改查询来修复它,因为表中已经有很多用户(+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
Run Code Online (Sandbox Code Playgroud)
您可以执行UNION of 2查询而不是OR.我知道在至少一个其他DBMS中这个速度快一个数量级的实例,并且我猜测MySQL的查询优化器可能共享相同的"特性".
SELECT whatever
FROM votes v
INNER JOIN
users u
ON v.user_id_1 = u.uid
WHERE v.user_id_2 = 9834
AND v.votes_2 = 0
UNION
SELECT whatever
FROM votes v
INNER JOIN
users u
ON v.user_id_2 = u.uid
WHERE v.user_id_1 = 9834
AND v.votes_1 = 0
ORDER BY updated_at DESC
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4163 次 |
| 最近记录: |