SELECT
*
FROM
`users`
WHERE
`id` != 1
AND `users`.`activated` = 1
AND NOT EXISTS (
SELECT
1
FROM
`blockings`
WHERE (blockings.user_id = users.id
AND blockings.blocked_id = 1)
OR(blockings.blocked_id = users.id
AND blockings.user_id = 1))
ORDER BY
users.id DESC
LIMIT 10 OFFSET 0
在30k行的表上完成此查询需要5秒
当我删除NOT EXISTS部分时,需要一段时间才能完成
在www.example.com上有索引users.id,blockings.user_id和blockings.blocked_id
如何加快查询速度?
2条答案
按热度按时间zu0ti5jz1#
这有点像“在黑暗中摸索”,因为您没有在问题中包含当前查询的表定义或EXPLAIN输出。
使用
blockings.user_id
和blockings.blocked_id
上的单列索引,您应该在当前查询的EXPLAIN输出中看到blockings
的index_merge。使用PK
(user_id, blocked_id)
和(blocked_id, user_id)
上的索引,在NOT EXISTS中使用UNION可能会快得多:正如MatBailie所建议的,值得尝试将UNION ALL分成两个独立的NOT EXISTS:
xsuvu9jc2#
下面是一个可能的替代查询,您可能需要在where子句中使用的列上添加索引。