从MySQL查询结果计数子查询

时间:2019-04-17 23:33:49

标签: mysql

我不知道该怎么解释,但我正在尝试优化第二个查询并正确编写它。

此查询很快-0.0005秒

select 
  wp_users.ID
from wp_users
  inner join wp_usermeta
    on wp_users.ID = wp_usermeta.user)id
where wp_usermeta.meta_value like '%user%'
limit 10

当我添加此子查询时,它会大大降低速度-5.4秒

select 
  wp_users.ID,
  (select count(*) from wp_postmeta where meta_key = wp_users.ID) as posts_read
from wp_users
  inner join wp_usermeta
    on wp_users.ID = wp_usermeta.user)id
where wp_usermeta.meta_value like '%user%'
limit 10

当我增加限制时,执行时间当然会增加。有没有办法编写它以便执行更快?

2 个答案:

答案 0 :(得分:1)

首先要尝试在wp_postmeta (meta_key)上添加索引。

您还可以尝试是否对一次派生表进行聚合一次提供帮助。

SELECT wp_users.id,
       coalesce(wp_postmeta.count, 0) posts_read
       FROM wp_users
            INNER JOIN wp_usermeta
                       ON wp_users.id = wp_usermeta.user_id
            LEFT JOIN (SELECT count(*) count,
                              wp_postmeta.meta_key
                              FROM wp_postmeta
                              GROUP BY wp_postmeta.meta_key) wp_postmeta
                      ON wp_postmeta.meta_key = wp_users.id
       WHERE wp_usermeta.meta_value LIKE '%user%'
       LIMIT 10;

我猜已经有wp_users (id)的索引了。 wp_usermeta (user_id, meta_value)上的一个可能也有帮助。

如果可能的话,您不应在字符串的开头对通配符使用LIKE。因此,如果可能,请改用LIKE 'user%'甚至是= 'user...'(用正确的值填充...)。

答案 1 :(得分:0)

不需要wp_users:

SELECT user_id,count(*) as posts_read
FROM wp_usermeta
JOIN wp_postmeta ON meta_key = user_id
WHERE meta_value LIKE '%user%'
GROUP BY user_id`