Я работаю над ускорением моего приложения Zendframework + Doctrine 1.2 с использованием:
- APC
- Doctrine [функция useQueryCache]
- 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
??