-1

我发现了一个通过索引解决的类似问题,但我发现查询速度没有变化,返回游戏部分大约需要 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 将具有空值。

4

1 回答 1

0

我认为这将加快查询速度:

    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找到了匹配的行。

另一种方法是LEFT JOINWHERE ... AND ( EXISTS SELECT 1 ... )

对性能也有好处的是通用索引改进:http post_meta: //mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

于 2021-01-26T19:38:49.267 回答