【问题标题】:Caching MySQL UNION Queries缓存 MySQL UNION 查询
【发布时间】:2012-08-20 17:53:15
【问题描述】:

我读过 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 是如何被缓存的呢?

【问题讨论】:

    标签: mysql caching union query-cache


    【解决方案1】:

    这是因为每个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;
    

    【讨论】:

    • 这很奇怪。我之前在没有括号的情况下尝试过它,它给了我一个语法错误,只是再次尝试它并且它有效。之前一定是做错了什么哈哈.....谢谢!
    • 是的,我知道,有时也会发生在我身上。不客气! :)
    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2014-06-25
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    相关资源
    最近更新 更多