我在 AWS 上有一个运行基本配置的 RDS 服务器 (rd3.medium)。我尝试运行此查询,它在几毫秒内在我的本地计算机上运行,以及一个安装了 MySQL 服务器的基本 Web 服务器。但是,当我在 RDS 上运行它时,需要20秒。我正在使用通用配置 SSD 作为存储。
SELECT DISTINCT
p2.id
FROM
wp_posts p2
INNER JOIN
wp_postmeta pm2
ON
pm2.meta_key = 'wpcr3_review_post'
AND
pm2.post_id = p2.id
INNER JOIN
wp_posts p3
ON
p3.id = pm2.meta_value
AND
p3.post_status = 'publish'
INNER JOIN
wp_postmeta pm3
ON
pm3.meta_key = 'wpcr3_enable'
AND
pm3.meta_value = '1'
WHERE
p2.post_type = 'wpcr3_review'
我在运行时确实注意到EXPLAIN
它使用了一个临时表,所以我想知道是否存在 RDS 不能很好地处理它,而基本 MySQL 服务器安装可以很好地处理它的情况?
1 SIMPLE pm3 ref meta_key meta_key 576 const 334 Using where; Using temporary
1 SIMPLE pm2 ref post_id,meta_key meta_key 576 const 1335 Using where
1 SIMPLE p2 eq_ref PRIMARY,type_status_date PRIMARY 8 deaddictioncentres_staging.pm2.post_id 1 Using where
1 SIMPLE p3 eq_ref PRIMARY PRIMARY 8 deaddictioncentres_staging.pm2.meta_value 1 **Using index condition;** Using where; Distinct
我发现在所有其他服务器上的唯一区别是 RDS 服务器添加了使用索引条件;而其他公司都没有这样做。
更新 我发现了使用索引条件;是由于从 5.5 升级到 5.6。但我不明白为什么从 5.5 升级到 5.6 会让速度慢这么多。
答案1
所以我找到了答案。问题是由于查询设计不当造成的。(此查询来自 Wordpress 插件,因此这并不奇怪)。第三个连接不仅毫无价值,而且还附加了“创建”1 条记录在结果集中,用于 Post Meta 表中每条将 wpcr3_enable 设置为 1 * WP Post 表中每条记录,从而产生 500,000 行。我相信本地速度只是发送/处理该数据的问题。添加的 DISTINCT 关键字只是掩盖了这个问题,在正确编码的查询中实际上是不必要的。