Перейти к контенту
  • 0

Огромная база в мускуле


Unico

Вопрос

Ребяты, а где-нить уже выработаны рекомендации...

что делать с огромными базами.

 

у меня сервер с 4 гигами оперативы.

на форуме - 1,2 млн сообщенией.

база по пхпмайадмин - 2 гига.

 

----

 

седня проблема возникла после ежедневного бэкапа...

пришлось будить админа. ниже отрывки из переписки, если вам интересно:

 

----

 

Клиент (05:28:56 10/06/2010)

mySQL error: User b00001 has already more than 'max_user_connections' active connections

 

Админ (05:55:25 10/06/2010)

мусль похоже забил временными файлами раздел var несмотря на то что сами базы в другом разделе

 

Админ (05:55:40 10/06/2010)

у тебя нет мега больших таблиц которые между собой джойнятся?

 

Админ (06:05:41 10/06/2010)

джойница это селект запросы с join когда один запрос по двум таблицам сразу идет тогда создается временная таблица на диске

 

Клиент (06:08:23 10/06/2010)

фиг знает... спросить надо на ibresource.ru

стандартный движок форума...

 

Админ (06:16:43 10/06/2010)

я мускулю изменил папку для временных файлов посмотрим как он с этим жить будет

 

Админ (06:22:24 10/06/2010)

3.2G /usr/var/db/mysql/b00001_1

почему так много?

 

Админ (06:23:03 10/06/2010)

1.2G ibfposts.MYD

767M ibfposts.MYI

1.2G ibfposts.TMD

10K ibfposts.frm

 

Клиент (06:23:37 10/06/2010)

ну да...

1.2 posts

это таблица с постами форума

у меня 1,2 млн сообщений

 

Клиент (06:27:10 10/06/2010)

а вот тут 4 млн. сообщений

teron.ru

 

Админ (06:28:20 10/06/2010)

в версии 5.1 мускуля есть хорошая вещь переписывать движок не надо просто меняешь саму таблицу немного и у тебя таблица хранится по годам например

 

Админ (06:28:34 10/06/2010)

http://m.habrahabr.ru/post/66151/

 

Админ (06:29:00 10/06/2010)

у тебя пока старая версия стоит 4.1.22,

 

Админ (06:31:52 10/06/2010)

в общем такие таблицы большие надо или разбивать как тут написанно http://m.habrahabr.ru/post/66151/

либо переводить на другой тип - типа innodb

 

----

 

Вопрос всё тот же..

что нужно делать для оптимизации работы больших форумов?

Ссылка на комментарий
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0

Скорее всего разрослась ibf_posts.

ИМХО, всего 2 варианта:

1. Выносить старые топики в другую базу на копии движка в режим только для чтения. В действии можно посмотреть на форуме Экслера.

2. Мой вариант (на vesvalo.net) с упаковкой старых топиков и с раздельным хранением в БД и в файлах в зависимости от размера поста: всё, что больше 4 Кб хранится не в БД, а в файлах.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Админ (06:05:41 10/06/2010)

джойница это селект запросы с join когда один запрос по двум таблицам сразу идет тогда создается временная таблица на диске

Школоло атакуе.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

FatCat, вариант экслера с сохранением старых урлов можно сделать?

поставив статус архивный в админке, мы снизим нагрузку на майэскуль-сервер?

может, еще кеширование запросов к этой базе архивной как-то можно сделать?

 

Sannis, ежели, что по делу напишите еще... буду благодарен :)

 

когда ж инвижн будет делать скрипты для больших сайтов.

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

зачем всё в одно место валить.

 

во всех этих новых версиях по сути одна косметика

Ссылка на комментарий
Поделиться на других сайтах

  • 0
когда ж инвижн будет делать скрипты для больших сайтов.

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

зачем всё в одно место валить.

Это делается на уровне БД, школоло дало вам в общем-то полезную ссылку.

 

P.S. IPB в массовом виде не для этого разрабатывается. Стоимость работы PHP инженеров, которыми так кичиться IPS и крутых спецов по highload разнятся на порядок.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Зря вы насчет "школоло"...

просто человек мне объяснял как чайнику.

а так у него около сотни серверов или даже больше на администрировании.

 

по ссылке я плохо соображаю.. что получится в итоге.

будет несколько частей таблицы. но все равно будет одновременные запросы ко всем частям...

у меня на форуме много тем старых.. их постоянно поднимают.

 

разве будет существенная разница в плане производительности?

если запрос будет к одной большой таблице...

либо к частям этой таблицы будет несколько запросов одновременно?

 

как выглядит этот процесс партиционирования...

просто выполнить запрос в базе и всё? или надо в код вносить изменения?

за денежку кто-нить согласится сделать.. сколько стоить будет?

 

но самый главный вопрос.. поможет ли это

Изменено пользователем Unico
Ссылка на комментарий
Поделиться на других сайтах

  • 0

ссылка на хабр

Где?

в его посте вот такая ссылка есть ка крах на Хабр

http://m.habrahabr.ru/post/66151/

ну или вот так

http://habrahabr.ru/post/66151/

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Закешировалась "трешка" не по-детски. У меня в прошлый раз половины постов передо мной не было видно...

С партициями интересная возможность, поэкспериментирую в локалке. Спасибо за информацию!

 

FatCat, вариант экслера с сохранением старых урлов можно сделать?

Там перенос в другую БД; соответственно и урлы меняются. Другой вопрос, что можно заморочиться и сделать для перенесенных урлов внешние линки с 301-м редиректом.

Но меня больше устраивает мой мод, он незаметен, для поисковок вообще практически ничего не меняется.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Зря вы насчет "школоло"...

просто человек мне объяснял как чайнику.

а так у него около сотни серверов или даже больше на администрировании.

 

по ссылке я плохо соображаю.. что получится в итоге.

будет несколько частей таблицы. но все равно будет одновременные запросы ко всем частям...

у меня на форуме много тем старых.. их постоянно поднимают.

 

разве будет существенная разница в плане производительности?

если запрос будет к одной большой таблице...

либо к частям этой таблицы будет несколько запросов одновременно?

 

как выглядит этот процесс партиционирования...

просто выполнить запрос в базе и всё? или надо в код вносить изменения?

за денежку кто-нить согласится сделать.. сколько стоить будет?

 

но самый главный вопрос.. поможет ли это

Разбиение для вас ничего не даст.

Любой безусловный count(*) и иже с ними убьет все на корню (будет только медленней, чем сейчас).

Разбиение без правки core ipb не имеет смысла.

Хотя я могу ошибаться, но спецы поправят: в IPB кешированные счетчики же выбираются безусловно ? т.е. прямыми count-ами ?

Далее - при входе в тему оно все равно же будет забирать кол-во ответов для паджинации ?

ну и далее в том же духе. В общем если я не ошибся в своих предположениях на счет схемы работы ipb разбивать таблицы без правки кода смысла не несет. (Хотя есть вариант в подмене стандартных таблиц ipb представлениями с аналогичным названием, в которых ограничивать выборку из уже разбитых таблиц. Это будет даже лучше).

А в вашем случае- включить логирование slow queries и no index. Поставьте в качестве порога медленных запросов для начала секунд 10. Затем берите каждый запрос из лога, анализируйте explain-ом и улучшайте саму структуру БД.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Разбиение без правки core ipb не имеет смысла.

Подтверждаю.

Экспериментировал с миллионной базой прежде, чем делать свой мод раздельного хренения информации. Вот эксперимент:

В первом случае средний размер сообщения 1000 символов, размер базы 1.2 Гб; во втором случае вместо сообщений одиночный пробел, размер базы около 70 Мб.

Денвер5 на ноутбуке.

Выполнялся один и тот же запрос:

SELECT * FROM ibf_posts WHERE topic_id = 999 ORDER BY pid ASC LIMIT 15,15

 

В первом случае не хватило 30 секунд таймлимита, во втором случае меньше секунды.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Разбиение без правки core ipb не имеет смысла.

Подтверждаю.

Экспериментировал с миллионной базой прежде, чем делать свой мод раздельного хренения информации. Вот эксперимент:

В первом случае средний размер сообщения 1000 символов, размер базы 1.2 Гб; во втором случае вместо сообщений одиночный пробел, размер базы около 70 Мб.

Денвер5 на ноутбуке.

Выполнялся один и тот же запрос:

SELECT * FROM ibf_posts WHERE topic_id = 999 ORDER BY pid ASC LIMIT 15,15

 

В первом случае не хватило 30 секунд таймлимита, во втором случае меньше секунды.

Сдается мне это из-за fulltext индекса в ibf_posts (если там он был, или просто из-за индекса по полю текста сообщения). Можно попробовать решить select no index в этом случае.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Руки чешутся проверить, но не сейчас.

А от фултекста нужно в любом случае на больших форумах переходить на Сфинкс.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
мод раздельного хренения информации

Извините, не сдержался :lol:

 

Мне пока такие проблемы не грозят, но из любопытства зачитывался одно время этой веткой на IPS. Так вот - у ребят есть базы и по 20, и по 100Gb. Используют InnoDB и мощные сервера, и не жалуются...

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Сдается мне это из-за fulltext индекса в ibf_posts

Убит давным-давно.

мм, тогда давайте ради интереса разберемся- покажите структуру с индексами и explain запроса, интересно даже )

Ссылка на комментарий
Поделиться на других сайтах

  • 0

давайте ради интереса разберемся- покажите структуру с индексами и explain запроса

Структура: обычная ibf_posts от 1.3 с убитыми текстовыми индексами.

Сейчас повторить запрос не смогу, просто нет базы-миллионника; для экспериментов делал ее искуственно, дублируя 20 раз 50-тысячную таблицу.

Экспериментов делал много, и выявил, что тормоза не зависят от числа записей в базе, а зависят от размера самой таблицы; а если совершенно точно, то от размера файла ibf_posts.MYD

Где-то до 60-70 Мб размера файла запросы выполняются моментально - несколько милисекунд.

В интервале 70-200 Мб скорость запроса ощутимо нарастает, но может быть снижена "дефрагментацией" файла путем простейшей манипуляции:

SELECT * INTO OUTFILE 'ibf_posts.sql' FROM ibf_posts ORDER BY topic_id;
TRUNCATE ibf_posts;
LOAD DATA INFILE "ibf_posts.sql" INTO TABLE ibf_posts;

Больше 200 Мб происходит скачкообразный прирост времени выполнения запроса.

Я предполагаю, что sql грузит всю таблицу в оперативную память, а лимит оперативы порядка 200 Мб, выше которого винда начинает свопить.

Это подтверждается расхождениями цифр времени выполнения запроса с реальным временем ожидания; нередко цифры пишет меньше секунды, а ожидание ответа измеряется десятками секунд.

Не знаю, может быть тормоза возникают не на самом sql, а на связке апача с базой; мне в принципе все равно, мне важно, что тормоза есть и на локалке под виндой, и на стандартном юникс-хостинге.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

давайте ради интереса разберемся- покажите структуру с индексами и explain запроса

Структура: обычная ibf_posts от 1.3 с убитыми текстовыми индексами.

Сейчас повторить запрос не смогу, просто нет базы-миллионника; для экспериментов делал ее искуственно, дублируя 20 раз 50-тысячную таблицу.

Экспериментов делал много, и выявил, что тормоза не зависят от числа записей в базе, а зависят от размера самой таблицы; а если совершенно точно, то от размера файла ibf_posts.MYD

Где-то до 60-70 Мб размера файла запросы выполняются моментально - несколько милисекунд.

В интервале 70-200 Мб скорость запроса ощутимо нарастает, но может быть снижена "дефрагментацией" файла путем простейшей манипуляции:

SELECT * INTO OUTFILE 'ibf_posts.sql' FROM ibf_posts ORDER BY topic_id;
TRUNCATE ibf_posts;
LOAD DATA INFILE "ibf_posts.sql" INTO TABLE ibf_posts;

Больше 200 Мб происходит скачкообразный прирост времени выполнения запроса.

Я предполагаю, что sql грузит всю таблицу в оперативную память, а лимит оперативы порядка 200 Мб, выше которого винда начинает свопить.

Это подтверждается расхождениями цифр времени выполнения запроса с реальным временем ожидания; нередко цифры пишет меньше секунды, а ожидание ответа измеряется десятками секунд.

Не знаю, может быть тормоза возникают не на самом sql, а на связке апача с базой; мне в принципе все равно, мне важно, что тормоза есть и на локалке под виндой, и на стандартном юникс-хостинге.

Ну на самом деле с 200-ми метрами оперативки нет смысла что-то тестить или оптимизировать - все равно упремся в узкое место дискового массива.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

с 200-ми метрами оперативки нет смысла что-то тестить или оптимизировать - все равно упремся в узкое место дискового массива.

В это похоже и уперся топикстартер.

 

Так получилось, что у меня один из форумов - форум некоммерческой организации, и он весь в принципе ориентирован на волонтерскую работу, а не на заработок. Соответственно, по мере роста форума, не вкладывались деньги в увеличение возможностей хостинга, а добровольно развивался движок форума по вопросам ресурсоемкости. Получился движок, выдерживающий сотни одновременных посетителей на обычном шареде с гигабайтом дискового пространства, почти гигабайт сообщений в форуме занимает на диске на сегодня 250 Мб: все крупные сообщения сжаты gZIP-ом и разжимаются динамически по мере надобности.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

с 200-ми метрами оперативки нет смысла что-то тестить или оптимизировать - все равно упремся в узкое место дискового массива.

В это похоже и уперся топикстартер.

 

Так получилось, что у меня один из форумов - форум некоммерческой организации, и он весь в принципе ориентирован на волонтерскую работу, а не на заработок. Соответственно, по мере роста форума, не вкладывались деньги в увеличение возможностей хостинга, а добровольно развивался движок форума по вопросам ресурсоемкости. Получился движок, выдерживающий сотни одновременных посетителей на обычном шареде с гигабайтом дискового пространства, почти гигабайт сообщений в форуме занимает на диске на сегодня 250 Мб: все крупные сообщения сжаты gZIP-ом и разжимаются динамически по мере надобности.

ну оптимизаций/ускорений не на уровне БД можно придумать, думаю, множество. Но то, что модель БД в ipb не выдерживает никакой критики остается правдой )

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Ребяты, в общем админ мне просто сделал другую папку для временных файлов...

раньше они создавались в var-разделе вроде как.

Вот при бэкапе и repair ежесуточном ночном var-раздел забился и там что-то глюкнуло.

 

Сейчас вроде все нормально.

Работа форума быстрая.

напомню оперативы 4 гига

база по пхпмайадмин 2 гига

 

Но вопрос по выработке общих рекомендаций при больших базах по-прежнему актуальный.

 

>>>>>>Мне пока такие проблемы не грозят, но из любопытства зачитывался одно время этой веткой на IPS. Так вот - у ребят есть базы и по 20, и по 100Gb. Используют InnoDB и мощные сервера, и не жалуются...

 

этот момент заинтересовал

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Джойнится ibf_posts с ibf_topics при выводе топиков.

Это давно известный напряг.

Отображение тем в Forums.php, тяжёлый запрос Оптимизация 1.x

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Song, по этой ссылке:

http://www.sysman.ru/index.php?showtopic=15999

 

вот это

>>>Исправление: отключение выполнения запроса в админке

 

и это ниже

>>>По аналогии с профилем оптимизируем запрос подсчёта количества тем в разделе.

 

это два одинаково эффективнных способа решения одной проблемы? на выбор делать либо то, либо другое?

то есть "точечки" можно оставить, а исправить вторым способом?

 

---

 

или это две разные проблемы с двумя соответственно разными решениями...?

Изменено пользователем Unico
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Не знаю насчет MySQL, но на PostgreSQL секционирование больших таблиц через INHERIT дает огромный прирост производительности. Причем почти ничего даже не нужно переписывать - для приложения это по-прежнему будет единая таблица ibf_posts. Нужно будет поменять INSERT (указывать, в какую секцию вставлять новый пост), а также следить за созданием секций (раз в полгода-год добавлять новую).

 

Альтернативный вариант: использовать ltree. Это вообще улётная штука.

Добавляем в ibf_posts поле path для выборки в формате 'id_форума.id_топика', вешаем GIST-индекс с ltree_ops.

 

При обращении к странице темы делаем два основных запроса:

 

SELECT * FROM tbl_topics WHERE tid=X

 

SELECT *
FROM (
SELECT * 
FROM ibf_posts
WHERE path ~ '$forum_id.$topic_id' AND -- тут куча условий на любой вкус
ORDER BY id DESC --ORDER-стадию можно выкинуть грамотным CLUSTER!
LIMIT 30
OFFSET 0 -- странички
) AS p

JOIN (
tbl_members m
JOIN tbl_member_extra me ON (m.id=me.id)
) ON (m.id=p.author_id)

JOIN --и т.д. любые join'ы

 

По двум миллионам записей время сканирования индекса - меньше 30 мс.

http://www.sai.msu.su/~megera/postgres/gist/ltree/

 

И нет проблем.

 

Единственное - сравнительно медленные операции перемещения нодов. На огромной таблице может висеть секунд по 5-10. Но при этом не блокируются запросы на чтение. А посты .. часто ли вы их перемещаете?

 

Можно сделать совсем lighting-speed, добавив третий уровень в дерево - страницу.

Будет 'id_форума.id_топика.номер_страницы'

 

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

 

Но зато - мы полностью выкидываем LIMIT, OFFSET и ORDER. Условие

WHERE path ~ '5.117.2'

одним index scan'ом выберет именно то, что нам нужно. И даже в нужной последовательности.

 

Profit! А главное, сделать легко.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
вот это

>>>Исправление: отключение выполнения запроса в админке

 

и это ниже

>>>По аналогии с профилем оптимизируем запрос подсчёта количества тем в разделе.

 

это два одинаково эффективнных способа решения одной проблемы? на выбор делать либо то, либо другое?

то есть "точечки" можно оставить, а исправить вторым способом?

 

Нет, это просто ещё одна оптимизация.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.