Использование Doctrine Cache [функция useResultCache] + Dql Leftjoin производит больше запросов - PullRequest
3 голосов
/ 18 сентября 2011

Я работаю над ускорением моего приложения Zendframework + Doctrine 1.2 с использованием:

  1. APC
  2. Doctrine [функция useQueryCache]
  3. Doctrine [функция useResultCache]

из доктрины документация :

При использовании кэша результатов все становится еще лучше. Тогда ваш запрос процесс выглядит следующим образом (при условии, что найдена правильная запись в кэше):

Инициировать новый DQL-запрос

Вернуть набор результатов

Bootstrap.php: включить кэширование APC

if (isset($doctrineConfig['cache']) && $doctrineConfig['cache'] == true) {
            $cacheDriver = new Doctrine_Cache_Apc();
            $manager->setAttribute(Doctrine_Core::ATTR_QUERY_CACHE, $cacheDriver);
            $manager->setAttribute(Doctrine_Core::ATTR_RESULT_CACHE, $cacheDriver);
            $manager->setAttribute(Doctrine_Core::ATTR_RESULT_CACHE_LIFESPAN, 1800);
        }

Когда я добавляю useResultCache("true"), это увеличивает количество запросов с 11 до 18 запросов. и прошедшее время поднялось с 1.8 m.sec до 14.82 m.sec

вот мой запрос dql:

   $q->from("Dagho_Model_History h")
          ->where("h.date BETWEEN ? AND ? ", array($start_of_day, $end_of_day))
          ->leftJoin("h.Order o")
          ->leftJoin("o.Personal p")
          ->leftJoin("o.Domain d")
          ->leftjoin("d.Tld t")
          ->useResultCache(true)
          ->useQueryCache(true);

Он разбил соединительные части dql, которые должны быть выполнены в отдельном sql, я приведу приведенный sql в обоих случаях:

- до использования useResultCache(true) SELECT h.id AS h__id, h.order_id AS h__order_id, h.type AS h__type, h.date AS h__date, h.receipt AS h__receipt, h.dollar AS h__dollar, h.payment AS h__payment, h.profit AS h__profit, h.net_profit AS h__net_profit, h.exchange_diff AS h__exchange_diff, o.id AS o__id, o.domain_id AS o__domain_id, o.hosting_id AS o__hosting_id, o.personal_id AS o__personal_id, o.auth_id AS o__auth_id, o.timestamp AS o__timestamp, o.notes AS o__notes, o.price AS o__price, o.type AS o__type, o.expire_at AS o__expire_at, o.hosting_price AS o__hosting_price, o.domain_price AS o__domain_price, o.extra_fee AS o__extra_fee, o.orderid AS o__orderid, o.root_id AS o__root_id, o.lft AS o__lft, o.rgt AS o__rgt, o.level AS o__level, o.created_at AS o__created_at, p.id AS p__id, p.name AS p__name, p.sex AS p__sex, p.email AS p__email, p.landline AS p__landline, p.mobile AS p__mobile, p.address AS p__address, p.city AS p__city, p.national_number AS p__national_number, p.notes AS p__notes, p.credit AS p__credit, p.stopped AS p__stopped, p.root_id AS p__root_id, p.lft AS p__lft, p.rgt AS p__rgt, p.level AS p__level, p.created_at AS p__created_at, p.updated_at AS p__updated_at, d.id AS d__id, d.name AS d__name, d.sld AS d__sld, d.tld AS d__tld, d.personal_id AS d__personal_id, d.hosting_id AS d__hosting_id, d.tld_id AS d__tld_id, d.registartion AS d__registartion, d.expiration AS d__expiration, d.notes AS d__notes, d.status AS d__status, d.provider AS d__provider, d.domainnameid AS d__domainnameid, d.orderid AS d__orderid, d.os_username AS d__os_username, t.id AS t__id, t.tld AS t__tld, t.price AS t__price, t.dollar AS t__dollar FROM history h LEFT JOIN orders o ON h.order_id = o.id LEFT JOIN personal p ON o.personal_id = p.id LEFT JOIN domain d ON o.domain_id = d.id LEFT JOIN tld t ON d.tld_id = t.id WHERE (h.date BETWEEN ? AND ?)

  • после использования useResultCache(true)

SELECT p.id AS p__id, p.name AS p__name, p.sex AS p__sex, p.email AS p__email, p.landline AS p__landline, p.mobile AS p__mobile, p.address AS p__address, p.city AS p__city, p.national_number AS p__national_number, p.notes AS p__notes, p.credit AS p__credit, p.stopped AS p__stopped, p.root_id AS p__root_id, p.lft AS p__lft, p.rgt AS p__rgt, p.level AS p__level, p.created_at AS p__created_at, p.updated_at AS p__updated_at FROM personal p WHERE (p.id = ?)

и

SELECT d.id AS d__id, d.name AS d__name, d.sld AS d__sld, d.tld AS d__tld, d.personal_id AS d__personal_id, d.hosting_id AS d__hosting_id, d.tld_id AS d__tld_id, d.registartion AS d__registartion, d.expiration AS d__expiration, d.notes AS d__notes, d.status AS d__status, d.provider AS d__provider, d.domainnameid AS d__domainnameid, d.orderid AS d__orderid, d.os_username AS d__os_username FROM domain d WHERE (d.id = ?)

то есть его создание sql для ->leftJoin("o.Personal p") и ->leftJoin("o.Domain d")

но я не могу понять, почему это не создает ->leftjoin("d.Tld t")

Может кто-нибудь объяснить, почему он взял это 14.82 sec ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...