SlideShare a Scribd company logo
Почему сайт тормозит?
●   Лишний код
    ✔   Избыточное включение кода
    ✔   Избыточная функциональность
    ✔   Неоптимальный код
●   Лишняя нагрузка на БД
    ✔   Плохая структура данных
    ✔   Много запросов
    ✔   Неоптимальные запросы
Избыточное включение кода
Оказывается 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
Избыточная функциональность
   Лишний код всегда делает что-то ненужное


  1.
       Проблема: Зоопарк модулей
       Решение:   Custom Development vs. Модули



  2.
       Проблема: В друпале есть Alter!
       Решение:   Конструктор vs. Alter



  3.
       Проблема: Непонимание целей и задач
       Решение:   Делать то, что нужно, а не искать похожее
Структура данных. Индексы
    Индексы нужны для:   ●   EXPLAIN SELECT - для
●   JOIN ON                  анализа запроса
●   WHERE
                             ✔   Type = ALL !!!
●   ORDER BY
●   GROUP BY             ●   ANALYZE TABLE – для
●   HAVING                   обновления статистики
Много запросов. Конфиги
●   Не делать много таблиц для хранения конфигов
●   Хранить конфиги в более простых структурах
●   Стараться вычитывать все конфиги сразу, а не по одному



✔   Использовать VARIABLES для конфигов
✔   _drupal_bootstrap_variables – 0.130 c. (1000), 1.5 c. (6000)
✔   Новостной портал ~800, соц. Сеть ~1200
✔   JSON, Serialize
Много запросов. Кеш
    Плохо:
●   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]) : '';
Много запросов. 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);
Неоптимальные запросы
Плохо:                         Хорошо:
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)
СПАСИБО

 Simplicity is the key to happiness

           что в переводе означает



Пишите мало качественного кода :)
                         Много плохого кода не пишите

More Related Content

What's hot

YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоAlexander Makarov
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?
yiiconf
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Moscow.pm
 
Функциональные тесты на Perl
Функциональные тесты на PerlФункциональные тесты на Perl
Функциональные тесты на Perl
Ilya Zelenchuk
 
Jquery selector optimization in drupal
Jquery selector optimization in drupalJquery selector optimization in drupal
Jquery selector optimization in drupalYury Glushkov
 
11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД
Roman Brovko
 
Mongo db aggregation
Mongo db aggregationMongo db aggregation
Mongo db aggregation
Acceptic
 
Haskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell languageHaskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell language
Alexander Granin
 
D8 - Serialize, Normalize - Михаил Крайнюк, DrupalJedi
D8 - Serialize, Normalize - Михаил Крайнюк, DrupalJediD8 - Serialize, Normalize - Михаил Крайнюк, DrupalJedi
D8 - Serialize, Normalize - Михаил Крайнюк, DrupalJedi
DrupalSib
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)ygoltsev
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Yandex
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWPositive Hack Days
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
PVasili
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasov
Pavel Vlasov
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Perl: Symbol table
Perl: Symbol tablePerl: Symbol table
Perl: Symbol table
Elena Shishkina
 
Caching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoCaching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander Shumenko
DrupalCampDN
 
PHP basic
PHP basicPHP basic
PHP basic
Noveo
 
Javascript
JavascriptJavascript
Javascript
Vasya Petrov
 

What's hot (20)

YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что нового
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
 
Функциональные тесты на Perl
Функциональные тесты на PerlФункциональные тесты на Perl
Функциональные тесты на Perl
 
Jquery selector optimization in drupal
Jquery selector optimization in drupalJquery selector optimization in drupal
Jquery selector optimization in drupal
 
11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД
 
Mongo db aggregation
Mongo db aggregationMongo db aggregation
Mongo db aggregation
 
циклы
циклыциклы
циклы
 
Haskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell languageHaskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell language
 
D8 - Serialize, Normalize - Михаил Крайнюк, DrupalJedi
D8 - Serialize, Normalize - Михаил Крайнюк, DrupalJediD8 - Serialize, Normalize - Михаил Крайнюк, DrupalJedi
D8 - Serialize, Normalize - Михаил Крайнюк, DrupalJedi
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasov
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Perl: Symbol table
Perl: Symbol tablePerl: Symbol table
Perl: Symbol table
 
Caching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoCaching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander Shumenko
 
PHP basic
PHP basicPHP basic
PHP basic
 
Javascript
JavascriptJavascript
Javascript
 

Viewers also liked

10 strange issues in Drupal or why clients don't like Drupal
10 strange issues in Drupal or why clients don't like Drupal10 strange issues in Drupal or why clients don't like Drupal
10 strange issues in Drupal or why clients don't like DrupalYury Glushkov
 
Removing superfluous page loads, or a few more words about popups and ajax
Removing superfluous page loads, or a few more words about popups and ajaxRemoving superfluous page loads, or a few more words about popups and ajax
Removing superfluous page loads, or a few more words about popups and ajaxYury Glushkov
 
Client optimization drupal
Client optimization drupalClient optimization drupal
Client optimization drupalYury Glushkov
 
Create payment systems for Drupal Commerce
Create payment systems for Drupal CommerceCreate payment systems for Drupal Commerce
Create payment systems for Drupal CommerceYury Glushkov
 
Enfoque CláSico
Enfoque CláSicoEnfoque CláSico
Enfoque CláSico
guest36e3e43
 
Enfoque clásico de la administración
Enfoque clásico de la administraciónEnfoque clásico de la administración
Enfoque clásico de la administración
Guillermo A.
 
SEO: Getting Personal
SEO: Getting PersonalSEO: Getting Personal
SEO: Getting Personal
Kirsty Hulse
 

Viewers also liked (8)

10 strange issues in Drupal or why clients don't like Drupal
10 strange issues in Drupal or why clients don't like Drupal10 strange issues in Drupal or why clients don't like Drupal
10 strange issues in Drupal or why clients don't like Drupal
 
Removing superfluous page loads, or a few more words about popups and ajax
Removing superfluous page loads, or a few more words about popups and ajaxRemoving superfluous page loads, or a few more words about popups and ajax
Removing superfluous page loads, or a few more words about popups and ajax
 
Drupal vs ubercart
Drupal vs ubercartDrupal vs ubercart
Drupal vs ubercart
 
Client optimization drupal
Client optimization drupalClient optimization drupal
Client optimization drupal
 
Create payment systems for Drupal Commerce
Create payment systems for Drupal CommerceCreate payment systems for Drupal Commerce
Create payment systems for Drupal Commerce
 
Enfoque CláSico
Enfoque CláSicoEnfoque CláSico
Enfoque CláSico
 
Enfoque clásico de la administración
Enfoque clásico de la administraciónEnfoque clásico de la administración
Enfoque clásico de la administración
 
SEO: Getting Personal
SEO: Getting PersonalSEO: Getting Personal
SEO: Getting Personal
 

Similar to Server optimization

PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
Ontico
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1
Pavel Egorov
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Pavel Novitsky
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debugging
aheadWorks
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresqlOleg Churkin
 
Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLНародные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQL
Nikolay Pisarev
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
Alexander Makarov
 
SQL Tricky (Иван Фролков)
SQL Tricky (Иван Фролков)SQL Tricky (Иван Фролков)
SQL Tricky (Иван Фролков)Ontico
 
Иван Фролков. Tricky SQL
Иван Фролков. Tricky SQLИван Фролков. Tricky SQL
Иван Фролков. Tricky SQL
PostgreSQL-Consulting
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
MoscowDjango
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Ontico
 
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QAFest
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
Vasiliy Deynega
 
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Ontico
 
Разработка бизнес приложений (5)
Разработка бизнес приложений (5)Разработка бизнес приложений (5)
Разработка бизнес приложений (5)
Alexander Gornik
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...phpdevby
 

Similar to Server optimization (20)

PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debugging
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresql
 
Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLНародные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQL
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
MongoDB@addconf
MongoDB@addconfMongoDB@addconf
MongoDB@addconf
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
SQL Tricky (Иван Фролков)
SQL Tricky (Иван Фролков)SQL Tricky (Иван Фролков)
SQL Tricky (Иван Фролков)
 
Иван Фролков. Tricky SQL
Иван Фролков. Tricky SQLИван Фролков. Tricky SQL
Иван Фролков. Tricky SQL
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)
 
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
 
Разработка бизнес приложений (5)
Разработка бизнес приложений (5)Разработка бизнес приложений (5)
Разработка бизнес приложений (5)
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
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 что в переводе означает Пишите мало качественного кода :) Много плохого кода не пишите