我正在寻找关于查询优化的第二个意见。
我在这个查询中运行一个大表(目前有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缓存。
我对联接查询的了解相当低,所以我正在寻找有关如何优化此问题的建议。
答案 0 :(得分:1)
这是您的查询:
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)
。但您可以使用每个子查询来单独优化它们。
答案 1 :(得分:0)
您的查询非常混乱,您的解释并没有真正向我澄清。您是否尝试获取用户13 /'subsectoren'的元值,然后选择具有'see_subsectoren'和相同元值的所有用户?那只是:
select user_id
from bf_user_meta
where meta_value in
(
select meta_value
from bf_user_meta
where meta_key = 'subsectoren' and user_id = 13
)
and meta_key = 'see_subsectoren';
如果我错误地解释了您的解释,请再次尝试解释您的查询应该做什么以及记录的相关性。