我的db表增长非常快(并且会继续),此时我对此查询有问题(好吧,其他人也是):
select user_id from post where user_id not in (select id from user)
我需要的是post表中的新ID,而不在用户表中。
以下是解释:
> mysql> explain select user_id from post where user_id not in (select
> id from user);
>
+----+--------------------+-------+-----------------+---------------+---------+---------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref |rows | Extra |
+----+--------------------+-------+-----------------+---------------+---------+---------+------+----------+-------------+
| 1 | PRIMARY | post | ALL | NULL |NULL | NULL | NULL | 16076920 | Using where |
| 2 | DEPENDENT SUBQUERY | user | unique_subquery | PRIMARY | PRIMARY | 8 | func | 1 | Using index |
+----+--------------------+-------+-----------------+---------------+---------+---------+------+----------+-------------+
我也试过这个:
SELECT p.user_id FROM post p LEFT JOIN user u ON p.user_id=u.id WHERE u.id IS NULL;
解释:
mysql> EXPLAIN SELECT p.user_id FROM post p LEFT JOIN user u ON p.user_id=u.id WHERE u.id IS NULL;
+----+-------------+-------+--------+---------------+---------+---------+-----------------+----------+--------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+-----------------+----------+--------------------------------------+
| 1 | SIMPLE | p | ALL | NULL | NULL | NULL | NULL | 14323335 | |
| 1 | SIMPLE | u | eq_ref | PRIMARY | PRIMARY | 8 | ghost.p.user_id | 1 | Using where; Using index; Not exists |
+----+-------------+-------+--------+---------------+---------+---------+-----------------+----------+--------------------------------------+
两个查询都必须查看整个表格帖子,而且非常庞大: 邮政表:16077899条目 用户表:9657158条目
查询需要几分钟(超过30分钟)才能执行,任何提示?
谢谢!
答案 0 :(得分:0)
我不是数据库方面的专家,但是您的第一个查询解释没有在userid上使用索引,您是否在post
表中的user_id字段上构建了任何索引?如果不是只是创造它。此外,您可以尝试group by / distinct来过滤您的用户,因为第一个查询将从post返回多个userid。所有这一切都在提高速度。
答案 1 :(得分:0)
我认为你应该做两件事......
将DISTINCT关键字添加到您的查询中,如下所示:
SELECT DISTINCT user_id 从邮寄 WHERE user_id NOT IN(SELECT id FROM user)
检查新的EXPLAIN PLAN。