WordPress将数字和字符串都存储到用户和帖子 meta表中。当我们搜索meta_value时,问题就来了:
当使用数字时,查询所需的时间是相同查询和字符串的20倍。
慢速0.73秒:
SELECT * from wp_postmeta AS pm WHERE pm.meta_key = '_customer_user' AND pm.meta_value = 30
快速0.0013秒:
SELECT * from wp_postmeta AS pm WHERE pm.meta_key = '_customer_user' AND pm.meta_value = '30'
每列和组合键都有一个键。我读到它可能是PACK_KEYS的问题,如果是这样,我仍然不知道如何改变它。
选择版本();
8.0.31
显示创建表格wp_postmeta;
CREATE TABLE `wp_postmeta` (
`meta_id` bigint unsigned NOT NULL AUTO_INCREMENT,
`post_id` bigint unsigned NOT NULL DEFAULT '0',
`meta_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`meta_value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
PRIMARY KEY (`meta_id`),
KEY `post_id` (`post_id`),
KEY `meta_key` (`meta_key`(191)),
KEY `postid_key_value` (`post_id`,`meta_key`,`meta_value`(20)),
KEY `key_value` (`meta_key`,`meta_value`(20))
) ENGINE=InnoDB AUTO_INCREMENT=4285535 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
慢慢解释:
SIMPLE pm NULL ref meta_key,key_value meta_key 767 const 46930 10.00 Using where
解释FAST:
SIMPLE pm NULL ref meta_key,key_value key_value 1106 const,const 1 100.00 Using where
如果我不能修复数据库中的这些索引,比可能使用一些WP过滤器来修复这种查询的帖子'和用户' meta?
1条答案
按热度按时间owfi6suc1#
pm.meta_value
为 * 字符串 *;30
是一个数字。比较它们需要将字符串转换为数字,这意味着检查每一行,而不能使用INDEX
。测试管柱与数量的其他3种组合可以有效地工作(即可能能够使用
INDEX
)解决方案是始终以字符串形式提供
meta_value
值。另请参阅此插件以了解
postmeta
中的效率:WP Index Improvements