当前位置: 首页 > 知识库问答 >
问题:

如何加速这个Wordpress Mysql查询?

厉令
2023-03-14

我在Wordpress网站上建立了一个搜索功能,用于搜索姓名和地点,如下所示:

#name search
select user_id from wp_usermeta where meta_key='first_name' 
AND meta_value LIKE 'term' 
AND user_id in (SELECT post_author FROM wp_posts WHERE post_type='attachment' 
AND length(post_content) > 0 
AND length(post_title) > 0 
AND post_author in (SELECT post_author FROM wp_posts WHERE post_type='article')) 

UNION 

#locality search
select user_id from wp_usermeta where meta_key in ('zip', 'city', 'state', 'country') 
AND user_id in (select user_id from wp_usermeta where meta_key = 'user_type'and meta_value = 'user') 
AND (meta_value LIKE 'term') 
AND user_id in (SELECT post_author FROM wp_posts WHERE post_type='attachment' 
AND length(post_content) > 0 
AND length(post_title) > 0 
AND post_author in (SELECT post_author FROM wp_posts WHERE post_type='article')) 
group by user_id

这大约需要3秒的运行时间。我正在尝试看看是否有更快的方法可以编写这个查询。我有innoDB和索引,但有很多记录。这是查询的最快版本,但3秒仍然是相当慢的。有什么想法吗?

编辑(SQL explain结果,倒数第二个值是行数):

“6”,“dependent subquery”,“wp_posts”,“index_subquery”,“type_status_date,post_author”,“post_author”,“8”,“func”,“1”,“using where”

“7”,“dependent subquery”,“wp_posts”,“index_subquery”,“type_status_date,post_author”,“post_author”,“8”,“func”,“1”,“using where”

“5”,“依赖子查询”,“wp_usermeta”,“ref”,“user_id,meta_key,fh_danb_1”,“fh_danb_1”,“776”,“const,func”,“1”,“using where”

wp_usermeta有超过500k行,但我认为我应该索引列meta_value?

不确定是否可以使查询本身在语法上更快。

这里使用的两个表是wp_posts(post_author,post_date,post_date_gmt,post_content,post_title,post_excerpt,post_status,comment_status,ping_status,post_password,post_name,to_ping,pinged,post_modified_gmt,post_content_filtered,post_parent,guid,menu_order,post_type,post_mime_type,comment_count,up,down,wp_posts.post_author值与wp_usermeta.user_id相同。Wp_posts有超过100k行,wp_usermeta有超过500k行。

共有1个答案

颛孙哲
2023-03-14

我无法测试您的查询,但我会这样做:

  • 用内部连接替换子句
  • meta_value='term'替换为meta_value='term'
  • 删除分组依据作为联合查询(不包含union ALL子句)已删除重复项
  • 在键上添加索引,也可能在某些文本字段上添加索引。

如果我没有犯任何错误,这应该是结果查询:

select wp_usermeta.user_id
from
  wp_usermeta inner join wp_posts wp1
  on wp_usermeta.user_id=wp1.post_author and wp1.post_type='attachment'
  inner join wp_posts wp2
  on wp_usermeta.user_id=wp2.post_author and post_type='article'
where
  wp_usermeta.meta_key='first_name' 
  AND wp_usermeta.meta_value='term' 
  AND length(wp_usermeta.post_content) > 0 
  AND length(wp_usermeta.post_title) > 0 

UNION 

select wp_um1.user_id
from
  wp_usermeta wp_um1 inner join wp_usermeta wp_um2
  on wp_um1.user_id=wp_um2.user_id and wp_um2.meta_key = 'user_type'
     and wp_um2.meta_value = 'user'
  inner join wp_posts wp1
  on wp_usermeta.user_id=wp1.post_author and wp1.post_type='attachment'
  inner join wp_posts wp2
  on wp_usermeta.user_id=wp2.post_author and post_type='article'
where
  wp_um1.meta_key in ('zip', 'city', 'state', 'country')
  AND (wp_um1.meta_value = 'term')
  AND length(wp_um1.post_content) > 0
  AND length(wp_um1.post_title) > 0
 inner join wp_posts wp1
  on wp_usermeta.user_id=wp1.post_author and wp1.post_type='attachment'
  inner join wp_posts wp2
  on wp_usermeta.user_id=wp2.post_author and post_type='article'
inner join (select post_author
            from wp_posts
            where post_type in ('attachment','article')
            group by post_author
            having count(*)>1) wp on wp_usermeta.user_id = wp.post_author
 类似资料:
  • 问题内容: 我有以下查询: 目前,此查询大约需要93分钟才能完成。我想找到使它更快一点的方法。 该表大约有506,000行,其中大约490,000行包含的值,因此我怀疑我是否可以利用此处的任何索引。 该表(未压缩时)中包含约46 gigs的数据,但是该数据的大部分位于名为的文本字段中。我相信简单地加载和卸载许多页面会导致速度下降。一个想法是做一个新表 只是 在和现场,并保持尽可能小。但是,测试该理

  • 我用C#做了一个快速排序算法,当数组中只有10个项时,它可以工作。当我增加这个数字时,它就会陷入无限循环。这是问题所在的代码: 当调用sortArray时,left=0,right=49&array是一个随机的50个元素的一维数组。 您可以忽略对reDrawer和refresher的引用,因为这些不会影响排序算法,它们只会在图片框中绘制结果。

  • 我试图了解mysql查询在GROUP BY和不使用GROUP BY的情况下是如何工作的。 假设我有一个FILM_ACTORS表,其中每个ACTOR_ID都有一个相应的film_id。于是同一个演员参演了N部不同的电影。 我想选出参与20部电影的演员: 这个查询起作用,并返回参与20部电影的actor_id。但如果我只是: 为什么该查询仅在我将其等于film_actor表(5463)的大小时才返回值

  • 问题内容: 我正在编写一个小程序,该程序创建目录中所有文件的索引。它基本上遍历磁盘上的每个文件,并将其存储到可搜索的数据库中,就像Unix的locate。问题是,由于我有大约一百万个文件,因此索引生成非常慢。 一旦生成索引,是否可以快速找到自上次运行以来已在磁盘上添加或删除了哪些文件? 编辑 :我不想监视文件系统事件。我认为风险太高而无法同步,我更喜欢进行快速重新扫描之类的操作,以快速找到添加/删

  • 问题内容: 是否有可能优化我编写的查询 我创建了一种动态虚拟数据库,以使用户能够添加自定义字段而不影响数据库结构。到目前为止,这是该结构的非常简化的视图。 我们可以通过在db_structure中添加一行来创建一个新字段 我们希望记录的任何数据都记录到db_data中。 名称存储在db_names中,而name_id存储在db_data中 我正在尝试将案例输出到html表 希望其余的内容可以自我解

  • 我正在使用React,使用NodeJS将数据发送到我的PostgreSQL数据库。我的songs表中有一个外键,它引用了albums表中的id。我的问题是,如何将我第一次插入的id返回到第二次插入的相册中?以下是我目前的代码: 我还没有将专辑id添加到我的歌曲插入中。我在等着看如何把唱片id的值输入到我的第二个插页中?