Кеширование MySQL UNION Queries
Я читал, что MySQL может кешировать UNION's
, но в то же время я прочитал это..
Избегайте комментариев (и пробелов) в начале запроса - Query Cache выполняет простую оптимизацию, чтобы проверить, может ли запрос быть кэширован. Как я уже упоминал, кешируются только запросы 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
кешируется тогда?
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;