Что делать, когда растет база данных?

Вот какой вопрос. Есть интернет-магазин, в котором довольно много заказов. Магазин написан на php, база MySQl. Заказов поступает много, поэтому база растет просто огромными шагами. Т.е. таблица заказов и все остальные связанные с ней таблицы (таблицы статусов заказов, таблицы истории изменений заказов, таблицы товаров в заказах и т.д.). В общем счет идет на сотни тысяч записей. Соответственно, сайт, а особенно админка (т.к. менеджеры работают непосредственно со списком заказов) работают все медленнее и медленнее. Особенно речь идет о загрузке списка заказов за определенный интервал времени и с применением различных фильтров. Я понимаю, что заказы четырехлетней давности фактически уже не нужны и хранятся больше для статистики и истории. Но тем не менее они лежат в таблице заказов, таблица огромна и поэтому запросы на выборку к ней происходят все медленнее и медленнее. Что принято делать в таких случаях? Просто удалить старые заказы из таблицы? Можно было бы это сделать и скорее всего этого бы никто не заметил, но с другой стороны иногда требуется сделать просмотр статистики, либо еще какие-то данные о каком-то старом заказе или клиенте найти, и вот в этом случае старые заказы могут понадобиться. Так что делать в такой ситуации, может кто сталкивался с подобной проблемой и поможет советом?
  • Вопрос задан
  • 2988 просмотров
Пригласить эксперта
Ответы на вопрос 9
@maxyc_webber
Web-программист
Разработать функционал архивирования заказов. Перемещать из 1 базы с текущими заказами в базу архивных заказов. хранить там. Выборку производить только по запросу архивированных данных.
профит в использовании чистой информации, ненужная хранится на полках
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
займитесь оптимизацией запросов, расставьте индексы и проблема исчезнет.
Ответ написан
менеджеров и неактуальные записи в БД убрать с сайта
Ответ написан
Комментировать
azrail_dev
@azrail_dev
Партиционирование?
Ответ написан
Assargin
@Assargin
Перед ответом смотрю наличие ✔ в ваших вопросах
Я бы сначала привёл в порядок индексы таблицы, так как тот же поиск по неиндексированному полю - это очень плохо.
Далее, можно сделать аналогичную по структуре таблицу а-ля "order_archive", туда автоматически переносить все старые/выполненные/еще-по-каким-то-условиям-отобранные, короче, уже не актуальные заказы. И если нужно какую-то статистику, искать уже по ней, не трогая актуальные. Желательно этот поиск вынести с рабочего сервера, интернет-магазину ни к чему видимые пользователями лаги.
В довесок к вышеперечисленному, если хочется очень быстрых запросов в плане статистики, можно настроить Sphinx и искать по нему, он очень быстр (пробовал), или ElasticSearch (собираюсь пробовать)
Ответ написан
Комментировать
opium
@opium
Просто люблю качественно работать
Собственно менять бд и логику нет возможности, то тут делаем две простых вещи
1)Переносим базу на можный сервер с ссд и оптимизируем конфиг по максимуму.
2)Включаем slow queryies log и смотрим какие запросы можно пофиксить индексами, не сломав конечно производительности вставки излишними индексами.
Если что обращайтесь 8) имею богатый опыт оптимизации бд и интернет магазинов.
Ответ написан
@begemot_nn
Что делать, когда растет база данных?
1. Радоваться. Растет база, значит много заказов.
2. дальше нужно смотреть план запросов. если в логике приложения не используется статистика типа "количество заказов по одному пользователю за всю историю" или что то аналогичное - то создать копию структуры БД с другим именем и переместить в нее строки старше какого то времени (1 января например)
3. если п. 2 в чистом виде невозможен менять структуру БД добавлять таблицы со статистикой, после чего - выполнить п.2
4. ну и все таки погонять explain запросов, на предмет их оптимальности и использования индексов. потому как 100к записей - это не много.
Ответ написан
Комментировать
HaJIuBauKa
@HaJIuBauKa
Роль еще может играть версия сервера, ну и движок на котором сайт написан.
Еще один совет - если в фильтре выбирается 100000 записей - они никому никогда сразу не нужны - делайте обязательно постраничный режим - paging.
Индексы и еще раз индексы.
Протестируйте самые долгие запросы. Если они действительно вытаскивают 1000000 записей - оптимизируйте их.
Ответ написан
Комментировать
OlegTar
@OlegTar
программист .NET, Javascript, Perl
Прочитать это
dev.mysql.com/doc/refman/5.0/en/optimization.html

также можно для старых заказов сделать отдельную таблицу например, и туда перекидывать устаревшие заказы
можно сделать для запросов ненармализованные таблицы, например
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
от 300 000 до 500 000 ₽
07 мая 2024, в 17:40
300 руб./за проект
07 мая 2024, в 17:38
7000 руб./за проект