优化mysql NOT IN查询

时间:2018-01-09 09:39:48

标签: mysql wordpress query-optimization

我有两个表用户和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表很大,所以需要花费太多时间。

有人可以帮我解决如何优化此查询的问题吗?

enter image description here  Post Meta Table

3 个答案:

答案 0 :(得分:0)

查看expalin,并使用not exists替换

答案 1 :(得分:0)

试试这种方式

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)

希望这有帮助!

答案 2 :(得分:0)

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(我认为这些提示不会显着帮助查询。)