如何让mysql更好地执行union查询

时间:2011-04-01 06:38:16

标签: mysql union

下面是一个简单的查询,无论如何都会首先执行union运算符。 mysql执行此查询的方式太糟糕了。

mysql> explain select * from (select * from schema1.Application a union select * from schema2.Application b) c where c.SubmittedTime > now();
+----+--------------+------------+------+---------------+------+---------+------+--------+-------------+
| id | select_type  | table      | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+--------------+------------+------+---------------+------+---------+------+--------+-------------+
|  1 | PRIMARY      | <derived2> | ALL  | NULL          | NULL | NULL    | NULL | 559938 | Using where | 
|  2 | DERIVED      | a          | ALL  | NULL          | NULL | NULL    | NULL | 554541 |             | 
|  3 | UNION        | b          | ALL  | NULL          | NULL | NULL    | NULL | 554541 |             | 
| NULL | UNION RESULT | <union2,3> | ALL  | NULL          | NULL | NULL    | NULL |   NULL |             | 
+----+--------------+------------+------+---------------+------+---------+------+--------+-------------+
4 rows in set (1 min 1.57 sec)

在这种情况下,where子句可以在union的每个操作数内完成。这也是一种自然的做法。我们都知道

(a + b)/c = a/c + b/c

有没有办法强制mysql以最有效的方式执行查询?

1 个答案:

答案 0 :(得分:0)

在您的示例中,此类优化是可行的,但不是一般情况下。 MySQL通常将计划用于一般情况,因此您应该以a / c + b / c格式编写SQL。