我不知道如何确切地解释这一点,但我正在尝试优化第二个查询并正确地编写它。
此查询速度快- 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当然,当我增加限制时,执行时间就会增加。有没有一种方法可以让它执行得更快?
发布于 2019-04-17 23:50:51
首先要尝试的是在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...' (用正确的值填充... )。
发布于 2019-04-17 23:45:18
不需要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`https://stackoverflow.com/questions/55737309
复制相似问题