Кеширование 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;
Другие вопросы по тегам