Создание баз “на лету”. MySQL, PHP

151
26 января 2018, 23:55

Никогда с таким не сталкивался, но появилась необходимость разработать систему, которая бы создавала сайты, что называется, на лету. Если в двух словах, то есть главный сайт, где пользователь регистрируется и может создавать новые сайты (допустим, блоги). Количество сайтов ограничивается лишь его тарифом. Движок для сайтов есть, он требует соединение с базой. База состоит из ~10 таблиц. Сайт коннектится только к своей и не имеет доступа к другим, основной же (родительский) сайт имеет рутовые права и доступ ко всем.

Создание самих сайтов я реализовал, однако остался вопрос с базами.

Самое первое, что приходит на ум - создавать базы для каждого сайта (пользователей сейчас не учитываем). Но даже пустая база занимает место. Но это не так страшно, тут можно что-то оптимизировать, а вот то, что меня волнует больше всего: хранится ли в оперативной памяти информация обо всех базах на сервере? Знаю, что всё в MySQL хранится на диске, а в оперативной памяти находятся кэши, буферы, ну и всякая информация, которая не зависит от данных.

Я вычитал вот это:

Каждый файл индексов и файл данных открываются сразу для каждого параллельно работающего потока. Для каждого параллельного потока выделяется место в памяти для структуры таблицы, структур столбцов для каждого столбца и буфер размером 3 * n (где n представляет максимальную длину строки без учета столбцов BLOB)."

Я правильно понимаю, что для каждого соединения, MySQL сервер загружает информацию о таблицах, индексах и прочем? Ведь если да, то если взять за n количество баз, то при n, стремящимся к бесконечности, бесконечным будет и занимаемая память у сайта, который видит все, что не круто.

Можно для каждого пользователя создавать одну базу, где в таблицах использовать поле "user" и индексировать его. Ведь по-умолчанию, индексы строятся в виде двоичного дерева, поэтому время поиска будет что-то вроде lg n, что даже при большом количестве записей не плохо.

Можно еще проще - создать одну базу вообще для всех, но использовать уже два поля - user и site. Сложность поиска тоже будет lg n даже так.

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

Короче, сформулирую свой вопрос кратко:

Что конкретно MySQL хранит в оперативной памяти и как размер занимаемой памяти зависит от количества баз и таблиц в ней? Речь именно об оперативной, а не о хранилище. Все базы в пределах одного инстанса MySQL.

Может быть кто-то подскажет, как лучше реализовать систему создания сайтов: создавать базы для каждого сайта, для каждого пользователя или отдельную базу вообще для всех?

Буду рад, если кто-то откликнется.

READ ALSO
Как вытащить все аудиозаписи с ВК

Как вытащить все аудиозаписи с ВК

Я хочу знать как можно распарсить аудиозаписи из ВКПервоначально я подумал скачать все через расширение по типу savefrom

205
Загрузка библиотек через composer

Загрузка библиотек через composer

Установлен composer на хостинг, мне необходимо залить обновления библиотек для Drupal

166
Родительская запись у своего типа поста

Родительская запись у своего типа поста

Никак не могу добиться выбора родителя для произвольного типа поста в wpВот типа поста что есть

136