2012-05-24 7 views
0

Я делаю веб-приложение, и я использую MySQL в качестве моего БД. Моя БД будет больше в конце концов, например, более 100 миллионов строк в некоторых таблицах. Я просто хотел подтвердить одну вещь о таких больших таблицах.Производительность MySQL

Opt 1. Предположим, что таблицы имеют первичные ключи и делают мой запрос с использованием Первичного ключа, но мне нужно будет выполнить запросы mysql, скажем, 100 запросов для каждого входа пользователя.

USERID KEYS 

1  {1,2,3,4} 

я получите КЛЮЧИ для пользователя, а затем сделать первичный ключ запросов, чтобы получить каждое значение

PRI.KEY Value 

1  google 

2  yahoo 

3  aol 

4  windows 

Если пользователь входит в систему, мне нужно, чтобы получить его BOOKMARKED сайты, например. Итак, я сделаю два запроса Выберите KEYS из TB_KEYS, где USERID = 1; Затем я разберу KEYS и для каждого ключа, Выберите значение из TB_VALUES, где PRI.KEY = (KEY - i получен, синтаксический анализ из первого запроса);

Opt 2. Я не делаю запросов с использованием Первичных ключей, но мне нужно будет выполнить несколько запросов для входа пользователя.

OPT_TABLE_2

USERID KEY   Value 

1  1   google 

1  2   yahoo 

1  3   aol 

1  4   windows 

Выберите значение из OPT_TABLE_2, где USERID = 1;

Какой вариант был бы лучше ..?

+0

Ваш вопрос не имеет смысла.Можете ли вы включить некоторые фактические SQL-запросы того типа, который вы пытаетесь получить? – Cylindric

+0

Если пользователь входит в систему, мне нужно, например, получить его закладки. Итак, я сделаю два запроса в первом подходе: Выберите KEYS из TB_KEYS, где USERID = 1; Затем я разбираю КЛЮЧИ и для каждого ключа, Выберите значение из TB_VALUES, где PRI.KEY = (KEY - i получен, синтаксический анализ из первого запроса); –

+0

Редактировать свой вопрос, чтобы уточнить его, а не просто публиковать обновления как комментарии :) Таким образом, вы получаете хорошее форматирование, и будущим читателям не нужно сканировать все комментарии для подсказок. Не уверен, почему вы не можете просто использовать JOINs. – Cylindric

ответ

0

, но мне нужно будет запустить запросы mysql, скажем, 100 запросов для каждого входа пользователя.

Тогда по этой причине такой подход неверен. Вы не применили relational database normalisation rules.

, но мне нужно будет запускать несколько запросов для входа пользователя

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

Уменьшение количества запросов будет иметь массивный Влияние на производительность.

Это тривиально, чтобы проверить себя.

0

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

Возможно, было бы лучше иметь три таблицы: пользователи, пары пользовательских ключей, а затем клавиши.

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

Как и любой вопрос о производительности, который имеет значение: отметьте его. Создайте 10K тестовых пользователей и их данные и посмотрите, что происходит, когда вы запускаете его под каждым методом.

+0

Анонимный downvote почему? – zebediah49

+0

См. Ответ в другом месте - opt 1 breaks Первое правило nrormalisation, требует анализа данных для генерации дополнительных запросов, нет возможности присоединиться к таблицам в СУБД, накладные расходы на обработку запросов. – symcbean

+0

Действительно? Клянусь, был какой-то способ выбрать список индексов из строки на одном чистом шаге. Вот почему мой второй выбор заключался в использовании третьей таблицы для их связывания, если это не работает. – zebediah49

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