• Автор:

    Ash Williams
  • Добавлено:

    мар 09, 2017
  • Комментариев:

    0
  • Просмотров:

    472

Хак Оптимизация запросов в бд для мультикатегорий

Хак Оптимизация запросов в бд для мультикатегорий

В процессе работы над одним интересным модулем заметил одну закономерность.
Когда задействую модуль, контент начинает формироваться и выводиться быстрее.
Немножко поэкспериментировал и решил поделиться этим решением с вами :)
Скорость обработки запроса увеличивается почти в 10 раз. Проверено опытным путем. Для начала покажу результаты своих замеров на 2х тестовых сайтах.
Один с 100000 записями, на локалке. И второй - 3000 записей на хостинге.
Категорий 150шт на обоих сайтах с уровнями вложенности до 3го включительно.
Замеры производятся только на сами запросы в БД. Все единицы измерения в секундах.

Локалхост
Каждая новость отмечена в 4х разных категориях.
Ситуация №1. Родительская категория, в ней в общей сложности около 80 подкатегорий, 96430 новостей.
Стандартный вывод:
3.678
3.704
3.722
3.713
3.665


С помощью хака:
1.990
2.064
2.007
2.006
1.996

Не слабо, разница почти в 2 раза. Продолжим замеры.

Ситуация №2. Категория с подкатегорями, 17620 новостей.
Стандарт:
2.128
2.115
2.134


Хак:
0.847
0.848
0.864


Прирост производительности уже более чем в 2 раза.

Ситуация №3. Категория без подкатегорий, 2730 новостей
Стандарт:
1.630
1.639
1.626


Хак:
0.078
0.077
0.082

Ощутимо, не так ли. Хак работает более чем в 20 раза быстрее.
Теперь проведем аналогичные замеры, но уже на хостинге с 3000 новостями.

Хостинг
Каждая новость отмечена в среднем в 2-3х категориях.
Ситуация №1. Родительская категория, в ней в общей сложности около 80 подкатегорий, 660 новостей.
Стандартный вывод:
0,1643
0,1718
0,1635
0,1672


Хак:
0,0116
0,0072
0,0113
0,0068

Удивительно, не так ли. Более чем в 10 раз!

Ситуация №2. Категория с 5ю подкатегорями, 260 новостей.
Стандарт:
0,0364
0,0337
0,0236
0,0224


Хак:
0,0030
0,0038
0,0032
0,0048

Стабильно, быстрее в 10 раз.

Ситуация №3. Категория без подкатегорий, 90 новостей
Стандарт:
0,0103
0,0170
0,0097


Хак:
0,00142
0,00144
0,00151

Все так же, прирост в 5-10 раз.

Установка
Открыть файл engine/engine.php
Найти код:
					$where_category = "category = '{$get_cats}'";
				
				}
			
			}


После него вставить:
			$db->query("SELECT id FROM ".PREFIX."_post WHERE {$where_category} AND approve=1" . $where_date);
			$ids = array();
			while($r = $db->get_row()) $ids[] = $r['id'];
			if(count($ids)) $ids = implode(',',$ids);
			else $ids = 0;
			$where_category = "id IN ($ids)";

Вот и все :)

Почему стоит ставить этот хак даже не смотря на включенный кеш?
1. Кеш все же периодически чистится.
2. В DLE до 11 версии кешируются только первые 6 страниц навигации. В 11 версии уже 11 страниц. Но все равно, все остальные страницы выводятся без кеша.

UPD:
К сожалению на посещаемом сайте данный хак оказался не столь производительным. Из-за повышенной длинны запроса он стал потреблять на порядок больше оперативной памяти.

Версия DLE: любая

С уважением,
Олег Александрович a.k.a. Sander dle
Вернуться
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.