[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как оптимизировать таблицу. Внутренняя переписка.
inpost
На момент было 18 млн. записей, объем таблицы - 20гб. Провёл чистку, сократил до 11,5 млн. записей. Причиной была медленная работа с данной таблицей в виду того, что слишком много записей.
Индексы расставлены, сейчас 10 индексов (половина составных).
Когда записи достигли 17-18 млн. (точки Х), сразу работать с таблицей стало невозможно, даже индексные выборы работали очень медленно. Чистка - лишь временное восстановление жизнедеятельности сайта, в ближайшем будущем снова 18 млн, только уже "полезных писем" и выборки снова перестанут адекватно работать.

Это проблема, и я предполагаю, что она из-за огромного объема самой таблицы. Как её решить? Какие есть пути дальнейшего развития?

П.С. MySQL, MyISAM движок. Никакой статики, постоянная динамика и все друг другу пишут письма. Каждый индекс отображает свой функционал для работы с данной таблицей.



Спустя 8 минут, 34 секунды (12.08.2012 - 18:00) m4a1fox написал(а):
На какой бд сайт?

Спустя 2 минуты, 15 секунд (12.08.2012 - 18:02) inpost написал(а):
m4a1fox
Выше подправил. (БД заменил на "Таблица"), думаю одно, пишу другое smile.gif

Спустя 6 минут, 34 секунды (12.08.2012 - 18:09) m4a1fox написал(а):
а если монго использовать?

Спустя 14 часов, 14 минут, 45 секунд (13.08.2012 - 08:24) sergeiss написал(а):
В Мускуле, также как и в Постгре, есть "Партиции" (partitions). Это - разбиение одной таблицы на несколько таблиц, у каждой из которых свои индексы. При дроблении данных по правильным признакам, все выборки существенно ускоряются. Потому что сначала БД определяет, в какой таблице (партиции) искать, а потом ищет внутри неё. При этом всём ты работаешь как с единой таблицей, совершенно не вникая во внутреннюю структуру. То есть, в запросах указываем только имя "ключевой" таблицы.

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

Так что копай в эту сторону.

PS. Судя по описанию, в Мускуле внутренняя структура партиций вообще скрыта от юзера (в Мускуле я не использовал их, только читал описалово smile.gif). В то время как в Постгре имеешь к ним полный доступ - тут я как раз много поработал.

PPS. Когда в Постгре делаю бэкап, то я могу в явном виде указать только те партиции, которые мне нужны в бэкапе. Что очень полезно, например, когда я делаю уменьшенную копию БД для переноса на ноутбук. Указываю все таблицы основной схемы и самые свежие таблицы из той схемы, где я "складирую" партиции. Правда, я потратил на реструктуризацию БД, по разным причинам, не меньше месяца рабочего времени... Включая время на разработку новой структуры, настройку партиций и собственно перепись данных. Но оно того стОило!

PPS^2. inpost - можно еще и "репликации" сделать wink.gif Это к вопросу о том, как ускорить выборки. Но репликации - это использование разных физических серверов, для супер-большого количества данных. Я думаю, что не твой случай. Но без указания этой фичи мой ответ будет неполным.

Спустя 4 минуты, 49 секунд (13.08.2012 - 08:29) vagrand написал(а):
inpost

Самый простой вариант, который видится мне, это сделать архивацию данных. Т.е. сделать копию данной талицы с приставкой "arc" и переносить туда всю переписку за исклбчением последних N месяцев или дней. Выборка писем насколько я понимаю скорее всего происходить по дате, так что зная за какое время у тебя в какой таблице хранятся данные сможеш выбрать из одной или другой.

Еще такая мысль - если есть поля типа char или text то лучше вынести их в отдельную таблицу и связать 1 к 1. Тогда основная таблица сразу похудеет в весе и возможно это облегчит работ с ней.

Спустя 5 минут, 38 секунд (13.08.2012 - 08:34) sergeiss написал(а):
Цитата (vagrand @ 13.08.2012 - 10:29)
Выборка писем насколько я понимаю скорее всего происходить по дате, так что зная за какое время у тебя в какой таблице хранятся данные сможеш выбрать из одной или другой.

При создании "партиций", о коих я написал только что, делается всё то же самое (критерии настраивает программер), только намного проще.

Спустя 5 минут, 11 секунд (13.08.2012 - 08:39) vagrand написал(а):
sergeiss

Увидел твой пост после того как свой написал. Ниразу за партиции не слыхал. Оч интересная тема если оно дествительнот так как ты говориш.

Спустя 20 минут, 16 секунд (13.08.2012 - 09:00) vagrand написал(а):
sergeiss

Почитал за партиции. В принципе идея прикольная но как пишут тут все пока далеко не так радужно как хотелось бы + не совсем понятно пока не попробуеш как будут работать составные индексы если одно из их полей является тем, по котоому разбита таблица на партиции.

Спустя 2 минуты, 31 секунда (13.08.2012 - 09:02) sergeiss написал(а):
vagrand - да, очень интересно и полезно smile.gif Чтобы понять, что такое партиции, можно провести такую параллель.
Вот есть куча данных (как раз "наш" случай). Дробим их на таблицы, при выборке данные объединяем через UNION. Возможно? Да, вполне рабочий вариант. Выборка будет вестись намного быстрее, чем если бы все данные были в одной большой таблице. Потому что реальная выборка будет только из нескольких таблиц (или вообще из одной), а не из всех.

Так вот. Партиции делаю то же самое, только никакого UNION использвать не нужно. И не нужно даже знать названия всех отдельных частей. У нас есть "точка входа" - имя основной таблицы. Этого более чем достаточно.

Как я уже сказал, в Мускуле не работал с Партициями smile.gif Только в Постгре. В Постгре всё очень "красиво" получается.
Что касается составных индексов - ну так думать надо, когда их пишешь! При дроблении на партиции указывается критерий дробления. По сути дела, это тоже как индекс.


_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.