我正在寻找有关查询优化的第二意见。
我在一个大表中运行此查询(当前有 12.000 行,但速度快如闪电,有 100.000 条记录)
Select a.user_id
from bf_user_meta a
left outer join bf_user_meta b
on a.meta_value =b.meta_value
where a.meta_key = 'subsectoren'
AND (a.user_id = '13' OR b.user_id = '13')
OR a.meta_key = 'see_subsectoren'
GROUP BY user_id
现在这个查询需要 13 秒的执行时间。
我获得了 user_id 和 meta_key 的索引
Mysql 缓存已打开。
我对联接查询的了解相当少,因此我正在寻求有关如何优化此查询的建议。
最佳答案
这是您的查询:
Select a.user_id
from bf_user_meta a left outer join
bf_user_meta b
on a.meta_value = b.meta_value
where a.meta_key = 'subsectoren' AND (a.user_id = '13' OR b.user_id = '13') OR
a.meta_key = 'see_subsectoren'
GROUP BY user_id;
这将具有挑战性。为了优化,我建议首先消除 or
并使用 union
(删除重复项):
select a.user_id
from bf_user_meta a
where a.meta_key = 'subsectoren' AND a.user_id = '13'
union
select a.user_id
from bf_user_meta a join
bf_user_meta b
on a.meta_value = b.meta_value
where a.meta_key = 'subsectoren' AND b.user_id = '13'
union
select
from bf_user_meta a
where a.meta_key = 'see_subsectoren';
这些的最佳索引是:bf_user_meta(meta_key, user_id)
和 bf_user_meta(meta_value, meta_key)
和 bf_user_meta(user_id, meta_value)
>。但是您可以使用每个子查询来分别优化它们。
关于mysql - 查询优化 - 第二意见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27742825/