下面是一个简单的查询,无论如何都会首先执行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以最有效的方式执行查询?
答案 0 :(得分:0)
在您的示例中,此类优化是可行的,但不是一般情况下。 MySQL通常将计划用于一般情况,因此您应该以a / c + b / c格式编写SQL。