Совет установки таблицы SQL

В основном у меня есть канал xml с удаленного сервера.

Канал xml имеет один параметр? value=n теперь N может только быть между 1 и 30

Что когда-либо оценивает, я выбираю, всегда будет 4 000 строк, возвращенных из XML-файла. Мой сценарий назовет этот XML-файл 30 раз для каждого значения один раз в день. Таким образом, это - 120 000 строк. Я буду делать вполне сложные запросы на этих строках. Но главное, я буду всегда фильтровать значением сначала так SELECT * WHERE value = 'N' и т.д. Это будет ВСЕГДА использоваться.

Теперь лучше иметь одну таблицу, где все 120k строки хранятся? или 30 таблиц были 4k строками, хранятся?

Править: рассматриваемая база данных SQL будет MySQL

Править: Только для создания этого немного более ясным данные будут ОБНОВЛЯТЬСЯ каждый день, таким образом, старые таблицы будут перезаписаны, я не хочу решений для архивации, просто лучший способ хранить данные, чтобы иметь как можно меньше узкие места производительности, результаты базы данных, когда-то произведенные, будут кэшироваться и также ежедневно обновляться.

Править: Я предполагаю, что был слишком неопределенен для своей собственной пользы :( В основном подача является списками лидеров, каждое значение является различным местоположением списка лидеров

Значения будут только обновлены, если положение списка лидеров изменится и всегда будет ТОЛЬКО 120k строками. ни больше, ни меньше.

Позволяет скажите:

  1. Синий
  2. Зеленый
  3. Красный

Это - текущий список лидеров и следующее обновление возвраты канала:

  1. Синий
  2. Красный
  3. Зеленый

Только строки 2 и 3 изменятся. Это - мой план так или иначе :)

ДРУГОЕ РЕДАКТИРОВАНИЕ>. <: строки будут только содержать самое большее 12 столбцов и меньше чем 1 КБ за строку. И обновление wil только происходит Один раз в день, потому что сервер, от которого подача, является медленным, и требуется 80 минут для моего сервера для получения всех значений канала от него.

5
задан Ozzy 14 April 2010 в 13:59
поделиться

6 ответов

С точки зрения хранилища, разница между таблицей в 120 тыс. Строк и 30 таблицами размером 4 тыс. Составляет небольшую разницу.

Что касается обслуживания, я всегда выбираю один стол. Это значительно упрощает работу с вашим кодом и SQL, и, поскольку вы уже используете предложение WHERE , я не вижу причин для разделения таблицы.

3
ответ дан 15 December 2019 в 06:21
поделиться

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

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

0
ответ дан 15 December 2019 в 06:21
поделиться

Я предпочитаю один стол.

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

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

Что еще более важно, что вы будете делать, если по какой-то причине вы решите заниматься 45 раз в день, 90 раз в день или каждые 5 минут (12 * 24 = 288 раз в день). Создание 288 таблиц и изменение всех запросов, связанных с этими таблицами, будет огромным упражнением.

0
ответ дан 15 December 2019 в 06:21
поделиться

Как говорили все остальные, идите за одним столом. На стороне базы данных не будет узких мест из-за этой единственной таблицы, если только ваша база данных уже плохо настроена, и в этом случае это выявит ситуацию, а не вызовет ее. Если вы проведете детальный анализ производительности, включающий все компоненты в потоке (с момента, когда пользователь запускает запрос, до момента, когда результаты возвращаются), вы увидите, что в вашем примере компонент базы данных не добавит какого-либо важного снижения производительности. . И, как указывали другие ответы, вы должны определить правильный индекс или индексы на основе ваших конкретных запросов.

0
ответ дан 15 December 2019 в 06:21
поделиться

Как сказал Одед, реальных проблем с масштабированием / производительностью при 120 000 строках нет, поэтому я бы тоже выбрал уникальную таблицу (для простоты).

Если в будущем вам потребуется сильно масштабировать , просто помните эту статью о том, «почему базы данных SQL не масштабируются» . Помимо прочего, в статье объясняется, почему «разделение» (или «сегментирование») плохо для базы данных SQL:

сегментирование разделяет ваши данные по некоторому типу границ приложения. {{1} } Например, вы можете хранить пользователей , имена которых начинаются с AM, в одной базе данных , а NZ - в другой. Или используйте по модулю идентификатора пользователя на количество баз данных.

Это требует глубокой интеграции в приложение и тщательного планирования схемы секционирования относительно схемы базы данных и типов запросов, которые вы хотите делать. Резюме: большая заноза в заднице.

Таким образом, хотя сегментирование является формой горизонтального масштабирования, оно не соответствует пункту № 2: оно непрозрачно для бизнес-логики приложения.

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

Даже если изначально речь шла о разделении между большим количеством баз данных, та же концепция может быть применена к вашему случаю, когда вы пытаетесь добиться какого-то «внутреннего» разделения.

Заключение, ответ для реального масштабирования - NoSQL . Опять же, не с 120K строками :)

0
ответ дан 15 December 2019 в 06:21
поделиться

Вам нужен один стол. В противном случае вам пришлось бы написать 30 разных запросов или создать решение для динамических запросов (фу).

Насколько широки ряды? Более того, сколько строк умещается на странице 8k SQL? (На основании этого вы можете предположить количество операций ввода-вывода на вашем диске.) Сколько времени требуется вашему оборудованию, чтобы прочитать такой объем данных? Или все это может уместиться в памяти, чтобы вы не так часто ударяли по диску? Я хочу сказать, действительно ли у вас проблемы с производительностью?

Размещение составного кластерного индекса в таблице так, чтобы ваше значение «n» было первым столбцом, оптимизирует эти чтения (но только если у вас всегда есть значение «n» в предложении WHERE). В качестве альтернативы, если «n» всегда находится в диапазоне от фиксированных значений от 1 до 30 и вы используете SQL 2005 и выше, вы можете реализовать секционирование таблицы, которое даст вам такой же прирост производительности и, возможно, немного большей гибкости, когда дело доходит до загрузка или выгрузка данных.

0
ответ дан 15 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: