我发现了一个通过索引解决的类似问题,但我发现查询速度没有变化,返回游戏部分大约需要 80 秒。这是将 WordPress 数据库中的元值提取到临时表中,以比较更新的名声时间戳是否匹配或不存在于通过帖子元值发布的帖子中。我发现当 m.meta_value 为 NULL 时 g.game_updated != m.meta_value 不显示,不添加 OR IS NULL 查询不到 0.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 IS 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 将具有空值。