MySQL: рекомендуемое количество строк
Рассмотрим индексированную таблицу MySQL с 7 столбцами, которая постоянно запрашивается и записывается. Какое количество строк рекомендуется содержать в этой таблице, прежде чем производительность будет улучшена путем разделения данных на другие таблицы?
8 ответов
Получите ли вы выигрыш в производительности, разделив данные, зависит от данных и запросов, которые вы на них будете выполнять. Вы можете хранить много миллионов строк в таблице, и с хорошими индексами и хорошо разработанными запросами это все равно будет очень быстрым. Рассматривайте разбиение только в том случае, если вы уже уверены, что ваши индексы и запросы настолько хороши, насколько это возможно, так как это может принести больше хлопот, чем стоит.
Там нет магического числа, но есть несколько вещей, которые влияют на производительность в частности:
- Индекс кардинальности: не надо индексировать строку, которая имеет 2 или 3 значения (например, ENUM). В большой таблице оптимизатор запросов будет игнорировать их.
- Существует компромисс между записью и индексами. Чем больше у вас индексов, тем больше времени занимает запись. Не просто индексировать каждый столбец. Проанализируйте ваши запросы и посмотрите, какие столбцы нужно проиндексировать для вашего приложения.
- Дисковый ввод-вывод и память играют важную роль. Если вы можете поместить всю свою таблицу в память, вы берете дисковый ввод-вывод из уравнения (в любом случае, когда таблица кэшируется). Я предполагаю, что вы увидите значительное изменение производительности, когда ваша таблица слишком велика для буферизации в памяти.
- Рассмотрите возможность разделения ваших серверов в зависимости от использования. Если ваша транзакционная система читает / записывает отдельные строки, вы, вероятно, можете выиграть себе время, реплицировав данные на сервер только для чтения для сводных отчетов.
Как вы, вероятно, знаете, производительность таблицы изменяется в зависимости от размера данных. Следите за таблицей / запросами. Вы узнаете, когда пришло время перемен.
MySQL 5 имеет встроенную разметку и очень хорош. Что приятно, вы можете определить, как ваш стол должен быть разделен. Например, если вы запрашиваете в основном на основе идентификатора пользователя, вы можете разбить таблицы на основе идентификатора пользователя, или если вы запрашиваете по датам, делайте это по дате. Что хорошо в этом, так это то, что MySQL будет точно знать, в какой таблице разделов искать, чтобы найти ваши значения. Недостатком является то, что при поиске в поле, которое не определяет ваш раздел, оно будет сканировать каждую таблицу, что может снизить производительность.
На самом деле это хороший вопрос для производительности. Вы читали Джей Пайпс? Там нет определенного количества строк, но есть определенный размер страницы для чтения, и могут быть веские причины для вертикального разбиения.
Посмотрите его презентацию по кунг-фу и просмотрите его посты. Я уверен, вы обнаружите, что он написал несколько полезных советов по этому вопросу.
Несмотря на то, что после факта вы могли бы указать размер таблицы, при которой производительность стала проблемой, я не думаю, что вы можете предсказать это, и уж точно не из информации, представленной на таком веб-сайте, как этот!
Некоторые вопросы, которые вы могли бы с пользой задать себе:
- Производительность в настоящее время приемлема?
- Как измеряется производительность - есть ли показатель?
- Как мы распознаем неприемлемую производительность?
- Измеряем ли мы каким-либо образом производительность, которая может позволить нам прогнозировать проблему?
- Все ли наши запросы используют эффективный индекс?
- Имитировали ли мы экстремальные нагрузки и объемы в системе?
Используя движок MyISAM, вы столкнетесь с жестким ограничением размера таблицы в 2 ГБ, если вы не измените значение по умолчанию.
Вы используете MyISAM? Планируете ли вы хранить более пары гигабайт? Остерегайтесь MAX_ROWS и AVG_ROW_LENGTH.
У Джереми Заводни есть отличная статья о том, как решить эту проблему.
Никогда не применяйте оптимизацию, если считаете, что она не нужна. В идеале это должно быть определено путем тестирования (как уже упоминали другие).
Горизонтальное или вертикальное разбиение может повысить производительность, но также усложнит ваше приложение. Не делайте этого, если вы не уверены, что вам это нужно И это определенно поможет.
Размер файла MyISAM данных 2G является только значением по умолчанию и может быть изменен во время создания таблицы (или позже с помощью ALTER, но для этого необходимо перестроить таблицу). Это не относится к другим движкам (например, InnoDB).