mysql 修复将数字作为字符串检查时查询速度慢的问题

whhtz7ly  于 2022-12-17  发布在  Mysql
关注(0)|答案(1)|浏览(136)

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?

owfi6suc

owfi6suc1#

pm.meta_value为 * 字符串 *; 30是一个数字。比较它们需要将字符串转换为数字,这意味着检查每一行,而不能使用INDEX
测试管柱与数量的其他3种组合可以有效地工作(即可能能够使用INDEX
解决方案是始终以字符串形式提供meta_value值。
另请参阅此插件以了解postmeta中的效率:WP Index Improvements

相关问题