我不知道该怎么解释,但我正在尝试优化第二个查询并正确编写它。
此查询很快-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
当我增加限制时,执行时间当然会增加。有没有办法编写它以便执行更快?
答案 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`