我读过 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
,因此,根据该页面,也不会被缓存。
那么UNION
s 是如何被缓存的呢?