Я думаю, многие в своей жизни сталкивались с ситуацией, когда у вас под рукой нет MySQL (по разным причинам, например хостер не позволяет), а все-таки иметь что-то подобное, или даже сам MySQL хочется. Теперь у вас есть надежда :)! Я и nblxa хотим представить проект под названием MooSQL, цель которого — предоставить MySQL-совместимую СУБД на чистом PHP на случай, если в доме закончился обычный MySQL.
Добро пожаловать под кат! Итак, продолжим :).
MooSQL [муу-скул] — это название нашей СУБД с намеком на то, что она будет поддерживать MySQL-совместимый синтаксис. Именно будет — на данный момент такая поддержка отсутствует. Сама СУБД является логическим продолжением YNDb, моего движка для хранения данных на PHP, описанного в этом хабратопике: habrahabr.ru/blogs/i_am_insane/70140.
Одна из поставленных целей — это хорошая (для СУБД на PHP :)) масштабируемость и высокая производительность благодаря использованию индексирования полей.
Умеет MooSQL не очень много — на данный момент доступен лишь API самой YNDb, который описан на этой вики-странице: code.google.com/p/moosql/wiki/HOWTO.
С тех пор YNDb претерпел немного изменений:
Во-первых, я бы хотел привести ссылку, которая давалась в топике про YNDb — База данных forum.dklab.ru (старая), импортированная в самодельный форум. С тех пор на нём поселились спам-боты и умудрились написать около 600 (!) Мб текста, написав порядка 120 000 новых сообщений (к тем 130 000, которые были). Форум до сих пор работает и не подает признаков смерти :).
Я не стал его трогать, поэтому повторно импортировал ту же базу в новое место: Форум, работающий на новой версии MooSQL. По указанной ссылке используется чуть-чуть улучшенная (с учетом появившихся с тех пор возможностей MooSQL) версия форума, работающая на последней на момент написания поста версии MooSQL.
СУБД написана на PHP5, без привязки ни к каким фреймворкам, расширениям PHP и т.д. Физически таблицы и базы данных представляют из себя файлы и папки соответственно. Одна таблица состоит из 4-6 файлов, в зависимости от использования индексов. При чтении из таблицы накладывается разделяемая блокировка на файл table_name.lock, что и позволяет делать параллельно выборки из одной и той же таблицы. При операциях записи ставится эксклюзивная блокировка на тот же файл.
Индексы бывают трех видов — PRIMARY (AUTO_INCREMENT), UNIQUE и INDEX. Формат PRIMARY индекса очень простой — записывается смещение в файле данных (32-битное) по адресу value*4. Это накладывает ограничение на размер файла с данными в 2 Гб. Для UNIQUE индексов используются Б-деревья (Статья про Б-деревья в Википедии), для INDEX — сочетание Б-деревьев и списков для хранения повторяющихся значений.
Данные хранятся в бинарном формате в виде последовательности строк, без разделителей и какой-либо информации о структуре таблицы. Мы называем этот формат «MooISAM». Планируется также сделать формат «MooDB» (по аналогии с InnoDB), который бы позволял осуществлять сильно-многопоточный доступ к данным одной и той же таблицы (MooISAM на данный момент более-менее нормально работает при степени параллельности доступа менее 10). Помимо этого, если MooDB будет, то он будет проектироваться с возможностью добавления поддержки транзакций и внешних ключей.
Если вам интересен этот проект, приглашаю вас в нем поучаствовать! Ядро MooSQL под названием YNDb уже приближается по стабильности к production-ready, и хотелось бы привлечь как можно больше людей к тестированию, прежде всего — написанию автоматических тестов для моей СУБД. Я на данный момент знаю о по крайней мере одной ошибке, которая может испортить ваши данные при корректной работе с API. Ну, и, естественно, ищутся желающие принять участие либо в разработке ядра СУБД, либо SQL-части. Обращайтесь, к примеру, в скайп, расскажу поподробнее, если интересно.
Сайт проекта на Google Code: code.google.com/p/moosql
PhpMooAdmin: moosql.googlecode.com/files/PhpMooAdmin.0.0.1.php
Добро пожаловать под кат! Итак, продолжим :).
Что такое MooSQL?
MooSQL [муу-скул] — это название нашей СУБД с намеком на то, что она будет поддерживать MySQL-совместимый синтаксис. Именно будет — на данный момент такая поддержка отсутствует. Сама СУБД является логическим продолжением YNDb, моего движка для хранения данных на PHP, описанного в этом хабратопике: habrahabr.ru/blogs/i_am_insane/70140.
Одна из поставленных целей — это хорошая (для СУБД на PHP :)) масштабируемость и высокая производительность благодаря использованию индексирования полей.
Что умеет?
Умеет MooSQL не очень много — на данный момент доступен лишь API самой YNDb, который описан на этой вики-странице: code.google.com/p/moosql/wiki/HOWTO.
С тех пор YNDb претерпел немного изменений:
- Полностью ООП и PHP5, научился бросать исключения при любых критических ошибках
- Улучшенная поддержка многопоточного доступа — есть возможность параллельно делать несколько селектов из одной и той же таблицы
- Добавлено два новых типа колонок, которые можно индексировать — BYTE и DOUBLE. Текстовые поля индексировать пока что все равно нельзя
- ! Row splitting — отныне стало возможным увеличивать длину текстовых полей! Это достигается с помощью введения нового типа записей, которые состоят из нескольких кусков.
Покажите пример работы!!
Во-первых, я бы хотел привести ссылку, которая давалась в топике про YNDb — База данных forum.dklab.ru (старая), импортированная в самодельный форум. С тех пор на нём поселились спам-боты и умудрились написать около 600 (!) Мб текста, написав порядка 120 000 новых сообщений (к тем 130 000, которые были). Форум до сих пор работает и не подает признаков смерти :).
Я не стал его трогать, поэтому повторно импортировал ту же базу в новое место: Форум, работающий на новой версии MooSQL. По указанной ссылке используется чуть-чуть улучшенная (с учетом появившихся с тех пор возможностей MooSQL) версия форума, работающая на последней на момент написания поста версии MooSQL.
Технические подробности
СУБД написана на PHP5, без привязки ни к каким фреймворкам, расширениям PHP и т.д. Физически таблицы и базы данных представляют из себя файлы и папки соответственно. Одна таблица состоит из 4-6 файлов, в зависимости от использования индексов. При чтении из таблицы накладывается разделяемая блокировка на файл table_name.lock, что и позволяет делать параллельно выборки из одной и той же таблицы. При операциях записи ставится эксклюзивная блокировка на тот же файл.
Индексы бывают трех видов — PRIMARY (AUTO_INCREMENT), UNIQUE и INDEX. Формат PRIMARY индекса очень простой — записывается смещение в файле данных (32-битное) по адресу value*4. Это накладывает ограничение на размер файла с данными в 2 Гб. Для UNIQUE индексов используются Б-деревья (Статья про Б-деревья в Википедии), для INDEX — сочетание Б-деревьев и списков для хранения повторяющихся значений.
Данные хранятся в бинарном формате в виде последовательности строк, без разделителей и какой-либо информации о структуре таблицы. Мы называем этот формат «MooISAM». Планируется также сделать формат «MooDB» (по аналогии с InnoDB), который бы позволял осуществлять сильно-многопоточный доступ к данным одной и той же таблицы (MooISAM на данный момент более-менее нормально работает при степени параллельности доступа менее 10). Помимо этого, если MooDB будет, то он будет проектироваться с возможностью добавления поддержки транзакций и внешних ключей.
Заключение
Если вам интересен этот проект, приглашаю вас в нем поучаствовать! Ядро MooSQL под названием YNDb уже приближается по стабильности к production-ready, и хотелось бы привлечь как можно больше людей к тестированию, прежде всего — написанию автоматических тестов для моей СУБД. Я на данный момент знаю о по крайней мере одной ошибке, которая может испортить ваши данные при корректной работе с API. Ну, и, естественно, ищутся желающие принять участие либо в разработке ядра СУБД, либо SQL-части. Обращайтесь, к примеру, в скайп, расскажу поподробнее, если интересно.
Сайт проекта на Google Code: code.google.com/p/moosql
PhpMooAdmin: moosql.googlecode.com/files/PhpMooAdmin.0.0.1.php