Лучше создать таблицу для каждой учетной записи пользователя или одну огромную таблицу для всех пользовательских данных в MYSQL

8

Я создаю веб-каталог, который позволит отдельным пользователям зарегистрироваться для учетной записи и хранить текстовые документы в базе данных mysql.

Первоначально, вероятно, будет всего несколько сотен пользователей, но мы надеемся, что в какой-то момент их будет от 10000 до 100000. И каждый пользователь сможет загрузить 100-200 «документов».

Будет ли эффективнее создать одну массивную таблицу, индексированную по номеру пользователя? Который теоретически может вырасти до 20 000 000 записей. Или пойти дальше и создать таблицу для каждого пользователя с индивидуальными документами?

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

Кит
источник

Ответы:

7

MySQL может легко справиться с 20M строками, если он правильно проиндексирован. У нас есть таблицы с более чем миллиардом строк.

Наличие одного стола чище. Не нужно делать магию в приложении на основе пользователя (имя). Проще сделать любую статистику по таблице документов тоже.

Я определенно пошел бы с одним подходом большого стола. Если вас беспокоит размер таблицы (физический), вам следует рассмотреть возможность разделения таблицы документов. http://dev.mysql.com/doc/refman/5.5/en/partitioning-types.html

Кароли Надь
источник
Спасибо за ответ. Тогда я определенно остановлюсь на одной таблице и исследую подход к разделению. Один вопрос, однако, что именно подразумевается под правильно проиндексированной таблицей? Я слышал, что на это часто ссылаются, и предполагаю, что это означает, что таблице базы данных нужен правильно определенный ключ индекса. Но есть ли что-то большее, чем это для лучшей оптимизации.
Кит
При правильном индексировании я имел в виду наличие хотя бы составного индекса для user_id со столбцами, по которым вы фильтруете или упорядочиваете по таблице документов, и индекс по имени пользователя в пользовательской таблице (вероятно, частичного индекса достаточно для проверки количества элементов 90-95 % достаточно). Например: sqlfiddle.com/#!2/9fb15/2 (В моем случае частичный индекс 5 для имени пользователя составляет 50%)
Károly Nagy
Я думаю, я понимаю, спасибо за помощь. Еще один вопрос, если у вас есть первичный индексный ключ для каждой таблицы, помогает ли оптимизация определять дополнительные столбцы, которые, как вы знаете, вы будете регулярно искать (например, родительская категория), в качестве индекса? Есть ли обратная сторона в определении первичного или уникального ключа и 2-4 индексов для каждой таблицы?
Кит
Индексы помогут, да. На самом деле, у вас всегда должны быть индексы для столбцов, по которым вы фильтруете, иначе запрос закончится поиском с полным сканированием. Единственным недостатком (помимо размера индекса) являются медленные вставки и обновления, однако, поскольку 5.1 с плагином InnoDB и 5.5 по умолчанию MySQL имеет быстрое создание индекса ( dev.mysql.com/doc/refman/5.5/en/… ), так что это не так большая проблема больше
Кароли Надь