MongoDB. Области применения, преимущества и узкие места, тонкости использован...
Server optimization
1. Почему сайт тормозит?
● Лишний код
✔ Избыточное включение кода
✔ Избыточная функциональность
✔ Неоптимальный код
● Лишняя нагрузка на БД
✔ Плохая структура данных
✔ Много запросов
✔ Неоптимальные запросы
2. Избыточное включение кода
Оказывается INCLUDE тоже занимает какое-то время!
Проблема: Избыточность кода в файлах *.module
Решение: Выносить максимум кода из *.module в *.inc
Путь Bootstrap FULL Render
<front> 300-400 2500-3500
<front> cache 250-350 -
User form page 200-400 500-1500
Ajax callback 200-400 30-1500
3. Избыточная функциональность
Лишний код всегда делает что-то ненужное
1.
Проблема: Зоопарк модулей
Решение: Custom Development vs. Модули
2.
Проблема: В друпале есть Alter!
Решение: Конструктор vs. Alter
3.
Проблема: Непонимание целей и задач
Решение: Делать то, что нужно, а не искать похожее
4. Структура данных. Индексы
Индексы нужны для: ● EXPLAIN SELECT - для
● JOIN ON анализа запроса
● WHERE
✔ Type = ALL !!!
● ORDER BY
● GROUP BY ● ANALYZE TABLE – для
● HAVING обновления статистики
5. Много запросов. Конфиги
● Не делать много таблиц для хранения конфигов
● Хранить конфиги в более простых структурах
● Стараться вычитывать все конфиги сразу, а не по одному
✔ Использовать VARIABLES для конфигов
✔ _drupal_bootstrap_variables – 0.130 c. (1000), 1.5 c. (6000)
✔ Новостной портал ~800, соц. Сеть ~1200
✔ JSON, Serialize
6. Много запросов. Кеш
Плохо:
● foreach () { SELECT }
● Часто вызываемая функция с одинаковым запросом
● Несколько повторяющихся запросов
Хорошо:
$cache = &drupal_static(__FUNCTION__); // ИЛИ cache_get()
if (count($cache) = 0) {
$cache = db_query("SELECT ...")->fetchAllKeyed(); // cache_set()
}
return !empty($cache[$var]) ? $cache[$var]) : '';
7. Много запросов. entity_load()
Плохо: Хорошо:
foreach ($entities as $e) { foreach ($entities as $e) {
entity_load(array($e->nid)); $ids[] = $e->id;
} }
entity_load($ids);
foreach ($rows as $row) {
foreach ($rows as $row) {
node_load($row->nid);
$nids[] = $row->nid;
}
}
node_load_multiple($nids);
8. Неоптимальные запросы
Плохо: Хорошо:
SELECT id, (SELECT …) SELECT...
WHERE id = (SELECT …) FROM table1 t1 JOIN
(SELECT …) t2
SORT BY (SELECT ...)
ON t1.id = t2.id ...
Плохо: Хорошо:
(oe_1, ..., oe_N) IN (SELECT EXISTS (SELECT 1 FROM ...
ie_1, ..., ie_N FROM ... WHERE subquery_where AND
WHERE subquery_where) oe_1 = ie_1 AND ...
AND oe_N = ie_N)
9. СПАСИБО
Simplicity is the key to happiness
что в переводе означает
Пишите мало качественного кода :)
Много плохого кода не пишите