1

我读过 MySQL 可以缓存UNION's,但同时我也读过..

避免在查询开始时使用注释(和空格)——查询缓存会进行简单的优化以检查查询是否可以被缓存。正如我提到的,只有 SELECT 查询被缓存——所以它查看查询的第一个字母,如果它是“S”,它会在缓存中继续查询查找,如果不是——跳过它。

来源:http ://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/

话虽如此,既然 UNION 以括号开头,它们是如何缓存的?

根据 mysql.com:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

第一个字母不是“S”,所以会被跳过!?

我也看到你可以做这样的事情..

SELECT * FROM (
    (SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
    UNION ALL
    (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10)
) AS u

但是它会是一个sub-select,因此,根据该页面,也不会被缓存。

那么UNIONs 是如何被缓存的呢?

4

1 回答 1

2

这是因为每个SELECT查询都可以写成'S'它的起始字母。

您不需要编写子查询来缓存此UNION查询,因为括号可以从您的查询中删除,并且可以修改为:

SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10
UNION
SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10;
于 2012-08-28T12:07:14.150 回答