首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL阻塞IS NULL 11,000条记录

MySQL阻塞IS NULL 11,000条记录
EN

Stack Overflow用户
提问于 2020-11-29 09:11:56
回答 1查看 87关注 0票数 0

我发现了一个类似的问题,用索引解决了这个问题,但我发现查询速度没有变化,返回游戏部分大约需要80秒。这是将元值从WordPress数据库拉到临时表中,以通过post元值比较更新后的fame时间戳是否匹配发布的帖子。我发现当m.meta_value为NULL时,g.game_updated != m.meta_value不会显示,如果不加上OR is NULL,查询的结果是小于.5秒,加上就是80秒加上10,800条记录。对这两个值添加主索引和常规索引不会产生任何影响

代码语言:javascript
运行
复制
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秒的讨论无关。

代码语言:javascript
运行
复制
+---------+--------------+------------+
| 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将具有空值。

EN

回答 1

Stack Overflow用户

发布于 2021-01-27 03:38:49

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

代码语言:javascript
运行
复制
    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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65056041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档