我发现了一个类似的问题,用索引解决了这个问题,但我发现查询速度没有变化,返回游戏部分大约需要80秒。这是将元值从WordPress数据库拉到临时表中,以通过post元值比较更新后的fame时间戳是否匹配发布的帖子。我发现当m.meta_value为NULL时,g.game_updated != m.meta_value不会显示,如果不加上OR is NULL,查询的结果是小于.5秒,加上就是80秒加上10,800条记录。对这两个值添加主索引和常规索引不会产生任何影响
CREATE TEMPORARY TABLE tmp_meta
SELECT distinct m.meta_value as game_id,m2.meta_value FROM wp_postmeta m
INNER JOIN wp_postmeta m2
ON m.post_id = m2.post_id
AND m2.meta_key = 'game_updated'
AND m.meta_key = 'game_id';
ALTER TABLE tmp_meta ADD PRIMARY KEY (game_id(100));
ALTER TABLE tmp_meta ADD KEY (meta_value(100));
CREATE TEMPORARY TABLE tmp_needsUpdate
SELECT g.*,m.meta_value FROM wp_radium_games g
LEFT JOIN tmp_meta m
on m.game_id = g.game_id
WHERE ( g.game_updated != m.meta_value OR m.meta_value IS NULL);
删除了最后一个查询,因为它与添加m.meta_value为NULL会使查询增加80秒的讨论无关。
+---------+--------------+------------+
| post_id | meta_key | meta_value |
+---------+--------------+------------+
| 1 | game_id | 100 |
| 1 | game_updated | 9999 |
| 2 | game_id | 101 |
| 2 | game_updated | 9997 |
| 3 | game_id | 102 |
| 3 | game_updated | 9992 |
+---------+--------------+------------+
+---------+--------------+-----------+
| game_id | game_updated | game_name |
+---------+--------------+-----------+
| 100 | 9999 | game1 |
| 101 | 9999 | game2 |
| 102 | 9992 | game3 |
| 104 | 9992 | game4 |
| 105 | 3333 | game5 |
| 106 | 3333 | game6 |
+---------+--------------+-----------+
这应该返回游戏101、104、105和106作为100匹配的更新9999以及102匹配的9992。游戏101与game_updates不匹配,104 - 106将具有空值。
发布于 2021-01-27 03:38:49
我认为这将加快查询速度:
LEFT JOIN tmp_meta m
ON m.game_id = g.game_id
AND g.game_updated != m.meta_value
WHERE m.meta_value IS NULL;
ON
用于表示表之间的关系;WHERE
用于过滤。但是模式LEFT JOIN...IS NULL
正在测试LEFT JOIN
是否找到匹配的行。
另一种方法是用WHERE ... AND ( EXISTS SELECT 1 ... )
替换LEFT JOIN
对性能也有好处的是post_meta
的通用索引改进:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta
https://stackoverflow.com/questions/65056041
复制相似问题