2008-09-20 22 views
1

Рассмотрим индексированную таблицу MySQL с 7 столбцами, которая постоянно запрашивается и записывается в. Какое рекомендуемое количество строк, которые эта таблица должна содержать до того, как производительность будет улучшена путем разделения данных на другие таблицы?MySQL: рекомендуемое количество строк

ответ

11

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

+1

Я принял этот ответ, потому что он кажется наиболее прагматичным. Другие люди давали факторы, чтобы искать, что полезно, но вы не всегда можете быть рядом, когда дела идут не так, поэтому я считаю, что лучший литеральный ответ на мой вопрос - «несколько миллионов». – tags2k

0

Хотя после факта вы могли указать на размер стола, при котором производительность стала проблемой, я не думаю, что вы можете предсказать ее, и, конечно, не из информации, представленной на веб-сайте, такой как это!

Некоторые вопросы, которые вы могли бы с пользой спросить себя:

  • ли производительность в настоящее время приемлемым?
  • Как измеряется производительность - это есть метрика?
  • Как мы можем признать неприемлемой производительностью?
  • У нас есть Измерение производительности любым способом, что может позволять нам спрогнозировать проблема?
  • Все ли наши запросы, используя эффективный индекс?
  • Мы моделировали экстремальные нагрузки и объемы в системе?
0

Используя движок MyISAM, вы столкнетесь с жестким ограничением 2GB на размер таблицы, если вы не измените значение по умолчанию.

3

Там нет магического числа, но есть несколько вещей, которые влияют на производительность, в частности:

  • Индекса мощностный: не беспокоить индексировать строки, которая имеет 2 или 3 значения (как в ENUM). В большой таблице оптимизатор запросов игнорирует их.
  • Существует обмен между отчетами и индексами. Чем больше индексов у вас есть, тем длиннее будет запись. Не просто индексируйте каждый столбец. Проанализируйте свои запросы и посмотрите, какие столбцы необходимо индексировать для вашего приложения.
  • Диск IO и память играют важную роль. Если вы можете поместить всю свою таблицу в память, вы берете диск IO из уравнения (как только таблица будет кэширована, так или иначе). Я предполагаю, что вы увидите большое изменение производительности, когда ваша таблица слишком велика для буферизации в памяти.
  • Рассмотрите возможность разбивки ваших серверов на использование. Если ваша транзакционная система читает/записывает отдельные строки, вы, вероятно, можете купить себе некоторое время, реплицируя данные на сервер только для чтения для агрегированной отчетности.

Как вы, вероятно, знаете, изменения производительности стола в зависимости от размера данных. Следите за своим столом/запросами. Вы узнаете, когда придет время для перемен.

0

Никогда не применяйте оптимизацию, если не считаете нужным. В идеале это должно определяться путем тестирования (как указывали другие).

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

Размер файла MyISAM данных 2G является только значением по умолчанию и может быть изменен при создании таблицы (или позже с помощью ALTER, но необходимо перестроить таблицу). Это не относится к другим двигателям (например, InnoDB).

+0

«Никогда не применяйте оптимизацию, если не считаете нужным». Возможно, в контексте разделения таблицы базы данных и неуверенности в том, что она будет делать, но в целом, конечно, это ужасный совет? Подождите, пока что-нибудь пойдет не так, как раньше, чем потратить несколько часов/дней на его фиксацию? – tags2k

+0

Я не защищаю «ожидание чего-то не так», а скорее выполняю некоторые тесты производительности, чтобы оценить, нужна ли дальнейшая оптимизация. Во многих случаях люди применяют ненужные оптимизации, которые добавляют сложность кода (уменьшая ремонтопригодность и увеличивая вероятность ошибок). – MarkR

0

На самом деле это хороший вопрос для работы. Вы читали Jay Pipes? Существует не определенное количество строк, но есть определенный размер страницы для чтения, и могут быть веские причины для вертикального разбиения.

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

0

Вы используете MyISAM? Вы планируете хранить более двух гигабайт? Следите за MAX_ROWS и AVG_ROW_LENGTH.

У Джереми Заводни есть вопрос о том, как решить эту проблему, excellent write-up.

2

MySQL 5 имеет partitioning встроенный и очень приятный. Приятно, что вы можете определить, как следует разделить таблицу. Например, если вы запрашиваете в основном на основе идентификатора пользователя, вы можете разбить свои таблицы на основе идентификатора пользователя, или если вы запрашиваете даты, сделайте это по дате. Что приятно в том, что MySQL точно знает, какую таблицу разделов искать, чтобы найти ваши значения. Недостатком является то, что если вы ищете в поле, которое не определяет ваш раздел, он будет сканировать каждую таблицу, что может снизить производительность.

Смежные вопросы