Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2011, 13:19   #1
ajevgen
 
Регистрация: 27.08.2011
Сообщений: 8
Вопрос Как можно уменьшить время выполнения запроса.

Добрый день!
Есть каталог продукции состоящий из 40 000 000 наименований. Выводится он в виде двойного пагинатора, примерно следующего вида:

ABCDEFGHIJKLMNOPQRSTUVWXYZ012345678 9
...
запись N;
...

<< < Страница 1 из N > >>

Т.е. сначала идет выборка по первой букве, а потом постранично по 500 наименований на страницу. Код выглядит так:
PHP код:
$sql "SELECT name, producer, description FROM `$name_table` WHERE name LIKE '$A%' LIMIT $start$stop"// поле name проиндексировано
$result_list =& $db->Execute($sql);
$rows = & $db->Execute("SELECT count(name) AS count FROM `$name_table` WHERE name LIKE '$A%'");
$count $rows->FetchRow();
$pagination->setCount($count['count']); // с помощью этого значения высчитывается $start и $stop 
Проблема заключается в следующем - время выполнения первого запроса составляет 30сек. и насколько я понимаю, это из-за конструкции LIMIT и большого объема таблицы. Как уменьшить время выполнения первого запроса? Или как обойтись без использования LIMIT?
Спасибо!
ajevgen вне форума Ответить с цитированием
Старый 06.09.2011, 14:33   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

LIMIT тут вообще не при чем - тормозит LIKE на ваших 40 лямах записей.

Теоретически может помочь FULLTEXT - но на практике реально лучше "домашний" вариант горизонтального масштабирования - разделение данных.
Andkorol вне форума Ответить с цитированием
Старый 06.09.2011, 16:26   #3
ajevgen
 
Регистрация: 27.08.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
"домашний" вариант горизонтального масштабирования - разделение данных.
если правильно понимаю, разбить на несколько таблиц?
ajevgen вне форума Ответить с цитированием
Старый 06.09.2011, 16:51   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от ajevgen Посмотреть сообщение
если правильно понимаю, разбить на несколько таблиц?
Можно разбить на несколько таблиц - вплоть до "по-буквенных" таблиц - с вашим-то кол-вом записей...
А можно разбить диапазонами - A-F, G-L, ...

Чтоб не трогать оригинальную таблицу - можно сделать по такому же принципу несколько связанных таблиц формата ID - name (также, по-буквенно или диапазоном):
ID - id записи в основной таблице
name - название товара(для алфавитной сортировки в выдаче)
Если это будет диапазон букв - то можно добавить поле letter - буква в диапазоне.
Проиндексировать всё это дело, конечно.

Тогда выборки по алфавитной пагинации будут идти через разбитые таблицы(только из нужной буквы/диапазона, а не из 40млн.), а выборки по числовой пагинации - по основной таблице(по ID - я так понимаю).

Естественно - это увеличит количество запросов, зато ускорит их обработку.
Ну и при добавлении/редактировании(названия) нужно не забыть проапдейтить эти связанные таблицы.
Andkorol вне форума Ответить с цитированием
Старый 07.09.2011, 15:55   #5
ajevgen
 
Регистрация: 27.08.2011
Сообщений: 8
По умолчанию

Andkorol, спасибо за совет!
ajevgen вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вывести время выполнения операции. Dasharnb777 Общие вопросы .NET 3 05.12.2010 16:38
Как можно уменьшить ширину видеоролика youtube размещенного на dle сайте justalex HTML и CSS 0 05.11.2010 14:01
время выполнения SOAP запроса hotman Java для Web (EE, Servlet, JSP, Tomcat, Spring MVC) 0 04.06.2009 13:32
Меня интересует проблема перегрева видеокарты... Как можно уменьшить её нагрев?? ЕвгениуS Компьютерное железо 13 21.07.2008 15:35
Как замерить время выполнения программы Gracel Общие вопросы Delphi 5 12.06.2007 22:16