mysql - 查询优化 - 第二意见

标签 mysql sql performance

我正在寻找有关查询优化的第二意见。

我在一个大表中运行此查询(当前有 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/

相关文章:

sql - 如何构造涉及最大值的 SQL 查询?

mysql - SQL : splitting a row in two rows

asp.net - 在 asp.net 应用程序中打开/关闭连接的良好做法?

mysql - 配置 Root MySQL 访问 - MySQL Logrotate

MySQL:更新查询中基于SUM的计算

使用名称而不是问号的 SQL 参数化查询

javascript - 如何快速从源数组中读取子数组

mysql - 具有自定义身份存储的 ASP.NET Web 应用程序和 MySQL

php - 将值计算从 SQL 移到 PHP 层是否更好?

c++ - jpeg 全尺寸解码速度最快的解码器是什么?