McLotos
2.04.2016 - 16:13
Всем привет.
Недавно провел оптиизацию одного скрипта, которы генерирует отчеты для пользователей, отеты бывают большими - 60000+ строк где каждая строка может содержать данные с 3-5 таблиц.
Так вот этот отчет генерировался пару часов каждый раз, а нужен он раз в месяц. Я подумал что нужно как-то ускорить процесс генерации этого отчета, потому-что все пару часов сервер работал на пределе своих возможностей и пользователи жаловались, я провел некоторые сравнения и был очень озадачен результатами
В качестве тестов посылал AJAX'ом запросы, каждый раз вытягивая по 100 записей
select * from table limit X,Y #50 сек 3500 записей
select * from table where id>X and id<=Y #50сек на 49000 записей
select * from table where `id`>X and `id`<=Y #50сек на 61000 записей
Как еще ускорить? Указывать все поля поименно.
Кто может объяснить почему всё именно так?
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
Цитата (McLotos @ 2.04.2016 - 12:13) |
В качестве тестов посылал AJAX'ом запросы, каждый раз вытягивая по 100 записей |
В чем польза подобного теста непонимаю...
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Цитата (McLotos @ 2.04.2016 - 15:13) |
где каждая строка может содержать данные |
Личными экспериментами установлено, что если размер строки больше примерно 4 килобайт, быстрее будет в цикле тянуть по 1 строке.
60 000 запросов - да, около 1 минуты, значит остальные 1 час 59 минут - это обработка данных. Это и нужно оптимизировать в первую очередь.
_____________
Бесплатному сыру в дырки не заглядывают...
AllesKlar
2.04.2016 - 21:18
McLotosДля быстрых отчетов нужны денормализированные таблицы.
Помимо заполнения основных, заполнять "отчетные" в режиме реального времени.
Хотя бы индексами к данным основных таблиц.
Тогда будет колоссальная экономия на обработке данных.
Да, база распухнет. Но не бывает быстро, качественно и дешево одновременно
_____________
[продано копирайтерам]
почему то мне кажется что у вас проблема в limit лежит. поможет совет AllesKlar. нужна денормализация для ускорения выборки.
Цитата (AllesKlar @ 2.04.2016 - 21:18) |
Для быстрых отчетов нужны денормализированные таблицы. |
Так точно.
McLotos
3.04.2016 - 16:27
Там и так база денормализована до безумия =)
В одной таблице лежит поле с сериалайзом, вытягивается каждая строка таблицы, распаковывается каждый сериалайз, по данным из сериалайза данные тянутся еще с 1й таблицы, там еще 2 сериалайза, они тоже разбираются и потом данные берутся еще с одной таблицы.
В результате данные с 4х таблиц распаковываются в огромный массив и записываются в файл построчно.
В общем жуть. А привести все к новой структуре это очень сложно в плане что нужно будет переработать всю структуру БД, а на боевом проекте... сами понимаете... файл выростает до 70-80 тысяч строк и 80 колонок
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
Цитата (AllesKlar @ 2.04.2016 - 17:18) |
Для быстрых отчетов нужны денормализированные таблицы. |
Цитата (McLotos @ 3.04.2016 - 12:27) |
Там и так база денормализована до безумия =) |
Все полезно в меру, возможно стоило бы хотя бы придерживаться первой нормальной форме.
Нужно обеспечить атомарность, а это можно сделать не сломав текущего функционала.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
McLotos
4.04.2016 - 11:51
Цитата (T1grOK @ 3.04.2016 - 18:41) |
Все полезно в меру, возможно стоило бы хотя бы придерживаться первой нормальной форме.
|
А это уже не ко мне, а к тем, кто проектировал такую БД =)
Сериалайзы в БД рулят мля
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
Про лимит
тут писали. Что касается косых кавычек, тоже на мой взгляд логично. Без них интерпретатору приходится проверять, не команда ли это. И так а каждую строку.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
DedMorozzz
4.04.2016 - 14:09
выбираешь именно по айди?
Это важно. Внятно сформулированый вопрос - "Выборка использует ключи?"
А с лимитом, проблема в том что мускул всё равно перебирает все поля, пока не найдёт нужные, с которых начнётся выборка (можешь это легко эксплейном проверить)
_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.