首页 > 解决方案 > 在“meta_value”中搜索值时加快 WordPress 查询

问题描述

关于如何加快meta_valuepostmeta表中搜索数据的 WordPress 查询的任何提示?

postmeta表包含不到 500 万条记录。自定义 WP 插件处理数据的时间太长。我追踪了哪个查询实际上变慢了并发现了这一点。该查询是运行时get_posts运行的 60 多个查询之一,但这个查询占用了 99% 的处理时间。

SELECT wp_wordpress_posts.* FROM wp_wordpress_posts  
INNER JOIN wp_wordpress_postmeta ON (wp_wordpress_posts.ID = wp_wordpress_postmeta.post_id)
INNER JOIN wp_wordpress_postmeta AS mt1 ON (wp_wordpress_posts.ID = mt1.post_id) 
WHERE 1=1  
AND wp_wordpress_posts.post_type = 'my_booking' 
AND (wp_wordpress_posts.post_status = 'publish') 
AND ( (wp_wordpress_postmeta.meta_key = '_rooms' AND CAST(wp_wordpress_postmeta.meta_value AS CHAR) = '236742')
AND  (mt1.meta_key = '_bookingDate' AND CAST(mt1.meta_value AS CHAR) = '2018-09-18') ) 
GROUP BY wp_wordpress_posts.ID ORDER BY wp_wordpress_posts.post_date DESC

我开始测试简化版

SELECT wp_wordpress_postmeta.* FROM wp_wordpress_postmeta  
WHERE meta_key = '_rooms' AND CAST(meta_value AS CHAR) = '236742'

处理此查询大约需要一秒钟。我意识到无论是谁编写了插件,都将可搜索的数据存储在meta_value设置为的字段中,LONGTEXT因此无法对其进行索引。由于可搜索的数据很短,我在meta_keyandmeta_value

ALTER TABLEwp_wordpress_postmeta添加键(meta_key(100), meta_value(100))

我运行了简短的查询,它提高了速度,使查询运行速度提高了 5 倍。我再次尝试了长查询,它没有对其进行任何改进。我尝试从长查询中运行另一个查询

SELECT wp_wordpress_postmeta.* FROM wp_wordpress_postmeta  
WHERE meta_key = '_bookingDate' AND CAST(meta_value AS CHAR) = '2018-09-18'

处理此查询大约需要一秒钟。为什么这个查询没有像第一个查询那样从缩短的索引中看到任何改进?我该如何解决?

标签: mysqlwordpress

解决方案


推荐阅读