执行一个语句要三分钟多,奇慢,求语句优化。mysql> SELECT COUNT(f.msg_id) FROM ecs_feedback AS f LEFT JOIN ecs_feedback AS r ON r.parent_id=f.msg_id WHERE f.parent_id=0 AND ISNULL(r.msg_id) ;
+-----------------+
| COUNT(f.msg_id) |
+-----------------+
|           24820 |
+-----------------+
1 row in set (3 min 3.09 sec)mysql> explain SELECT COUNT(f.msg_id) FROM ecs_feedback AS f LEFT JOIN ecs_feedback AS r ON r.parent_id=f.msg_id WHERE f.parent_id=0 AND ISNULL(r.msg_id) ;
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra                   |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------------------+
|  1 | SIMPLE      | f     | ALL  | NULL          | NULL | NULL    | NULL | 25057 | Using where             |
|  1 | SIMPLE      | r     | ALL  | NULL          | NULL | NULL    | NULL | 25057 | Using where; Not exists |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------------------+
2 rows in set (0.00 sec)mysql> show index from ecs_feedback;
+--------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table        | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| ecs_feedback |          0 | PRIMARY  |            1 | msg_id      | A         |       25057 |     NULL | NULL   |      | BTREE      |         |
| ecs_feedback |          1 | user_id  |            1 | user_id     | A         |        5011 |     NULL | NULL   |      | BTREE      |         |
+--------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
2 rows in set (0.02 sec)

解决方案 »

  1.   


    SELECT COUNT(f.msg_id) 
    FROM ecs_feedback AS f LEFT JOIN ecs_feedback AS r ON r.parent_id=f.msg_id 
    WHERE f.parent_id=0 AND r.msg_id is null换成 IS NULL 再试。
      

  2.   

    另外创建索引create index xxx1 on ecs_feedback(parent_id)
      

  3.   

    SELECT COUNT(f.msg_id) FROM ecs_feedback AS f LEFT JOIN 
    ecs_feedback AS r ON 
    r.parent_id=f.msg_id 
    WHERE f.parent_id=0 AND ISNULL(r.msg_id) ;在parent_id、msg_id上建立复合索引
    ISNULL(r.msg_id):无法用到索引