Только Mysql ИЛИ mysql + sqlite ИЛИ mysql + собственное решение - PullRequest
3 голосов
/ 23 декабря 2011

В настоящее время я создаю довольно большую веб-систему, и мне нужно сильное решение для базы данных SQL. Я выбрал Mysql вместо Postgres, потому что некоторые задачи должны быть доступны только для чтения (механизм MyISAM), а другие - массовые записи (InnoDB).

У меня есть вопрос об этой функции только для чтения. Это должно быть очень быстро. Пользователь должен получить ответ намного меньше, чем за одну секунду. Допустим, у нас есть одна хорошо проиндексированная таблица с именем "object", содержащая не более 10 миллионов строк, и еще одна с именем "element", содержащая около 150 миллионов строк. У нас также есть таблица с именем "element_object", содержащая информацию, связывающую объекты из таблицы "element" с таблицей "object" (сотни миллионов строк)

Итак, мы собираемся выполнить разбиение на таблицы "element" и "element_object" и иметь 8192 таблицы "element_hash_n{0..8191}a" и 24576 таблиц "element_object_hash_n{0..8191}_m{0..2}".

Ответом на вопрос пользователя будет двухэтапный поиск:

  1. Найти идентификатор элемента из таблиц "element_hash_n"
  2. Выберите основной sql для таблицы "object" и объедините с таблицей "element_object..hash_n_m", чтобы отфильтровать результат по найденному (с первого шага) ID

Интересно, о первом шаге: Что было бы лучше:

  1. хранить (все) более 32 тыс. Таблиц в mysql
  2. создать одну базу данных sqlite и сохранить там 8192 таблицы для первого шага
  3. создание 8192 различных файлов sqlite (баз данных)
  4. создать 8192 файла в файловой системе и создать собственное двоичное решение для поиска идентификатора.

Извините за мой английский. Это не мой родной язык.

1 Ответ

2 голосов
/ 24 декабря 2011

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

Мы использовали разделы в операционных системах, где более 90% запросов использовали текущий день в качестве критерия. В таком случае раздел на основе дней работал очень хорошо. Но у нас было только 8 разделов, и мы перенесли данные в другую базу данных для длительного хранения.

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

По какой технологии вы строите свою веб-систему? Вы должны также проверить эту часть. Сверхбыстрая база данных не сильно вам поможет, если вы потеряете время в плохо работающем веб-приложении.

...