使用UNION优化对GROUP BY uid的查询

时间:2014-05-20 08:17:42

标签: mysql sql

当GROUP BY uid和GROUP BY anonym_id被放入查询时,出现执行时间问题> 2秒。 问题是 - 如何使用GROUP BY语句来优化/覆盖此查询?

( SELECT u.id as uid, u.name, u.avatar, u.avatar_date, u.driver, 
   u.vehicle, m.msg, m.removed, (m.date DIV 1000) AS date, m.from_id = 1 AS outbox, 
   CASE WHEN m.read_state IS NULL THEN 1 ELSE 0 END AS read_state, d.anonym_id   
  FROM dialog as d CROSS JOIN messages AS m CROSS JOIN users AS u 
  WHERE (m.id=d.mid AND ((d.uid1 = 1 and u.id = d.uid2) or (d.uid2 = 1 and u.id = d.uid1)))   
  GROUP BY uid 
  ORDER BY d.id DESC ) 
UNION 
( SELECT u.id as uid, u.name, u.avatar, u.avatar_date, u.driver, u.vehicle,
   m.msg, m.removed, (m.date DIV 1000) AS date, m.from_id = 1 AS outbox,
   CASE WHEN m.read_state IS NULL THEN 1 ELSE 0 END AS read_state,
   d.anonym_id                
  FROM dialog as d FORCE KEY(anonym_id) CROSS JOIN messages AS m ON d.mid=m.id 
  CROSS JOIN users AS u ON u.id=d.uid2   
  WHERE d.anonym_id=100001   
  GROUP BY d.uid2 
  ORDER BY d.id DESC )
LIMIT 0, 20


mysql> show index from users;
+-------+------------+-------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name    | Seq_in_index | Column_name  | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| users |          0 | PRIMARY     |            1 | id           | A         |      606396 |     NULL | NULL   |      | BTREE      |         |               |
| users |          1 | number      |            1 | number       | A         |      606396 |     NULL | NULL   |      | BTREE      |         |               |
| users |          1 | name        |            1 | name         | A         |      121279 |     NULL | NULL   |      | BTREE      |         |               |
| users |          1 | show_phone  |            1 | show_phone   | A         |          10 |     NULL | NULL   |      | BTREE      |         |               |
| users |          1 | show_mail   |            1 | show_mail    | A         |          14 |     NULL | NULL   |      | BTREE      |         |               |
| users |          1 | show_on_map |            1 | show_on_map  | A         |          18 |     NULL | NULL   |      | BTREE      |         |               |
| users |          1 | show_on_map |            2 | map_activity | A         |      606396 |     NULL | NULL   |      | BTREE      |         |               |
| users |          1 | udid        |            1 | udid         | A         |      606396 |     NULL | NULL   | YES  | BTREE      |         |               |
| users |          1 | blocked     |            1 | blocked      | A         |          10 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+-------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

mysql> show index from dialog;
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table  | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| dialog |          0 | PRIMARY   |            1 | id          | A         |     2964484 |     NULL | NULL   |      | BTREE      |         |               |
| dialog |          1 | uid1      |            1 | uid1        | A         |      211748 |     NULL | NULL   |      | BTREE      |         |               |
| dialog |          1 | uid1      |            2 | uid2        | A         |     2964484 |     NULL | NULL   |      | BTREE      |         |               |
| dialog |          1 | uid2      |            1 | uid2        | A         |     1482242 |     NULL | NULL   |      | BTREE      |         |               |
| dialog |          1 | anonym_id |            1 | anonym_id   | A         |          18 |     NULL | NULL   |      | BTREE      |         |               |
| dialog |          1 | idx_mid   |            1 | mid         | A         |         200 |     NULL | NULL   |      | BTREE      |         |               |
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

mysql> show index from messages;
+----------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table    | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| messages |          0 | PRIMARY   |            1 | id          | A         |    23227116 |     NULL | NULL   |      | BTREE      |         |               |
| messages |          1 | user_id_2 |            1 | user_id     | A         |         188 |     NULL | NULL   |      | BTREE      |         |               |
| messages |          1 | user_id_2 |            2 | read_state  | A         |         188 |     NULL | NULL   |      | BTREE      |         |               |
| messages |          1 | user_id_2 |            3 | removed     | A         |         188 |     NULL | NULL   |      | BTREE      |         |               |
| messages |          1 | from_id   |            1 | from_id     | A         |         188 |     NULL | NULL   |      | BTREE      |         |               |
| messages |          1 | from_id   |            2 | to_number   | A         |         188 |     NULL | NULL   |      | BTREE      |         |               |
+----------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

EXPLAIN EXTENDED 
1   PRIMARY d   index_merge uid1,uid2,idx_mid   uid1,uid2   4,4     26  100.00  Using sort_union(uid1,uid2); Using where; Using temporary; Using filesort
1   PRIMARY u   ALL PRIMARY             625866  100.00  Using where; Using join buffer
1   PRIMARY m   eq_ref  PRIMARY PRIMARY 4   numbers.d.mid   1   100.00  
2   UNION   d   ref anonym_id   anonym_id   4   const   1   100.00  
2   UNION   u   eq_ref  PRIMARY PRIMARY 4   numbers.d.uid2  1   100.00  
2   UNION   m   eq_ref  PRIMARY PRIMARY 4   numbers.d.mid   1   100.00  
    UNION RESULT    <union1,2>  ALL 

0 个答案:

没有答案