@Bone

Что лучше много маленьких таблиц или одна гигантская в MySQL?

Будет такая таблица: id, id раздела, id пользователя. Пользователей миллионов 200, разделов около миллиона. Один пользователь может относиться к нескольким разделам. Мне нужно будет получать статистику сколько людей добавились в раздел и сколько удалились. Так вот вопрос в том, как лучше сделать: заводить под каждый раздел отдельную таблицу и просто писать туда id пользователей (тогда потенциально я могу оказаться с миллионом таблиц на руках) или писать всё в одну таблицу в виде id раздела, id пользователя. Тогда получу таблицу возможно с миллиардом строк, если не больше. Что лучше для такой задачи?
  • Вопрос задан
  • 7017 просмотров
Решения вопроса 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Откройте для себя шардирование. Как средствами sql сервера, так и средствами логики приложения.
Т.к пользователей на 2 порядка больше я бы шардировал по ним.
UPDу меня ощущение что вы не совсем понимаете как это все работает.
Я не понимаю что такое "полных хостинг"
MySQL это ПО. Которое установлено на железном или виртуальном сервере.
MySQL как SAAS предлагает например amazon, но цены там Вам не понравятся, под нагрузкой будет на порядки(x10) дороже аренды нескольких железных серверов.

Если у вас проект с реально 200 000 000 пользователей - то это немаленький кластер физических серверов. Балансировщики, Бекенды, фронтенды, sql, cache.
Это десятки и даже сотни физических серверов в общем случае.

PS Подумал и понял что у Вас задача в стиле "давайте на старте сделаем архитектуру на века".
Так не бывает. Архитектура на сотни миллионов пользователей отличается от того что можно сделать быстро и небольшой командой.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Postgre берите или Maria имхо лучше 1 большая таблица. Но надо ещё знать интенсивность чтения и записи.
Ответ написан
Комментировать
@andreloster
Все зависит от удобства кодинга и кол-ва запросов: можно насоздавать кучу таблиц с отдельными разделами и списком пользователей в каждом из них, затрачивая при этом кучу процессорного времени на запросы к БД, а можно хранить всё в одной таблице, но вопрос, разберетесь вы в этой горе мусора и сможете ли выстроить код таким образом, чтобы он обрабатывал запросы без ошибок, переполненный и прочего. Вам решать... Я все-таки бы добавлял отдельные таблицы с разделами в БД, а уж в них кидал списки юзеров: так и ясность есть, и можно оперативно перебирать элементы по их идентификатору, а вот если все в одной большой таблице, то получается, нужно будет работать со строками (делать поиск по подстрокам, по регуляркам возможно даже), в которых через разделитель будут храниться имена пользователей, которым доступен раздел, что несомненно геморно. Надеюсь, я правильно вас понял и вы поняли мой взгляд на ситуацию.
Ответ написан
begemot_sun
@begemot_sun
Программист в душе.
Если у вас задача один раз записал и забил (делаешь только select) то можно и одну.
Если у вас задача: здесь записал новое, тут добавил, там изменил (а индексы надо перестраивать), то видимо лучше шардировать (партиционировать) на несколько таблиц. Особенно это актуально при физическом удалении данных.
Если ваши данные накапливаются во времени, то лучше шардировать таблицы по дате (времени).
Ответ написан
Комментировать
zoonman
@zoonman
⋆⋆⋆⋆⋆
Я бы такое хранил в MongoDB, там шарды и репликация идут из коробки.
Т.к. вы сказали несколько разделов, то напрашивается коллекция users с документом, внутри которого будут ссылки на разделы.
Что-то в виде:
{
 _id: 992,
 sections: [
  {section: 24, access: 1, got: timestamp},
  {section: 25, access: 0, got: timestamp, lost: timestamp},
 ]
}

Используя Aggregation Framework вы легко получите требуемые данные.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы