【问题标题】:Optimize mysql NOT IN query优化 mysql NOT IN 查询
【发布时间】:2018-01-10 15:04:34
【问题描述】:

我有两个表用户和 postmeta。我想从用户表中获取用户 ID,并希望过滤 postmeta 表中不存在的用户 ID。

这是我的mysql查询

SELECT u.ID from users WHERE u.ID NOT IN (SELECT DISTINCT(meta_value) from postmeta WHERE meta_key = '_customer_user')

上面的查询工作正常,但由于我有成千上万的用户,而且 postmeta 表很大,所以需要太多时间。

谁能帮我优化这个查询?

【问题讨论】:

  • 你应该先阅读这篇文章,你需要的只是这些帖子large table optimization
  • 试试这个:SELECT DISTINCT(u.id) from users AS u, postmeta AS p WHERE p.meta_key = '_customer_user' AND u.id <> p.meta_value
  • 你有多少内存? innodb_buffer_pool_size 的值是多少?表是ENGINE=InnoDB吗?

标签: mysql wordpress query-optimization


【解决方案1】:
SELECT  u.ID
    FROM  users
    WHERE NOT EXISTS ( SELECT *
                FROM postmeta
                WHERE meta_key = '_customer_user'
                  AND meta_value = u.ID )

因为这闻起来像 WP,我在这里推荐一些关于 wp_postmeta 性能的提示:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta(我认为这些提示不会显着帮助 this 查询。)

【讨论】:

  • 不幸的是,查询仍然需要很长时间,因为我的用户表中有大约 20 万(20 万)个用户。
  • postmeta 中有多少行有meta_key = '_customer_user'
  • 假设meta_valueLONGTEXT,没有好的方法可以避免扫描_customer_user 的所有4M 行。说白了,用户和客户之间的链接必须用一个列来完成,不是“postmeta”键值机制。如果你在 WP 中做不到,那么我建议你放弃 WP。
  • 你能告诉我如何在以下查询上运行 mysql count 函数来获取返回的总行数。 从 wp_users 中选择 u.ID AS u 左外连接 wp_cmets AS c ON u.ID = c.user_id 左外连接 wp_posts AS p ON u.ID = p.post_author 左外连接 wp_links AS l ON u.ID = l.link_owner WHERE c.user_id 为 NULL 且 p.post_author 为 NULL 且 l.link_owner 为 NULL 且 YEAR(u.user_registered) = 2017 且 u.ID 不在 (SELECT DISTINCT(meta_value) FROM wp_postmeta WHERE meta_key = ' _customer_user' ) 按 u.ID 分组
  • @mubashir - SELECT COUNT(*) FROM ( SELECT ... ) AS x;
【解决方案2】:

看expalin,用not exists替换

【讨论】:

    【解决方案3】:

    试试这个方法

    SELECT u.ID
    FROM diet_users AS u
    WHERE NOT EXISTS
        (SELECT pm.meta_value
         FROM diet_postmeta AS pm
         WHERE meta_key = '_customer_user'
           AND pm.meta_value = u.ID)
    

    希望这会有所帮助!

    【讨论】:

    • 删除DISTINCT,完全没用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多