Mysql:针对巨大的表优化查询

时间:2014-06-17 10:29:48

标签: mysql sql performance optimization

我的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分钟)才能执行,任何提示?

谢谢!

2 个答案:

答案 0 :(得分:0)

我不是数据库方面的专家,但是您的第一个查询解释没有在userid上使用索引,您是否在post表中的user_id字段上构建了任何索引?如果不是只是创造它。此外,您可以尝试group by / distinct来过滤您的用户,因为第一个查询将从post返回多个userid。所有这一切都在提高速度。

答案 1 :(得分:0)

我认为你应该做两件事......

  1. 确保您拥有并在post(user_id)
  2. 上编制索引
  3. 将DISTINCT关键字添加到您的查询中,如下所示:

    SELECT DISTINCT user_id 从邮寄 WHERE user_id NOT IN(SELECT id FROM user)

  4. 检查新的EXPLAIN PLAN。