Добрый день! Я разрабатываю
SaaS-приложение, и сейчас встал выбор СУБД для хранения основных данных. Начинал разработку на MySQL, но сейчас не уверен в выборе. Переезд на другую СУБД на данном этапе для меня не составит проблем (использую PDO). далек от ясного понимания что такое «высокие нагрузки» для СУБД. Просто по моим расчетам примерно через год база будет весьма увесистой (см. ниже)
Основной выбор стоит между MySQL, PostgreSQL, MariaDB. Также, возможен, но не приветствуется вариант Microsoft SQL Server на Windows Azure
Ситуация такова:
- Сложных запросов к базе нет. Максимум JOIN из двух таблиц
- Большая часть запросов — чтение
- Есть одна самая важная и «главная» таблица (структура таблицы ниже под спойлером). Таблица будет расти примерно на 10-30 тысяч записей в сутки. Запись данных в эту таблицу — самое главное!
- Большая часть запросов на чтение будет как раз к «главной» таблице. По этой таблице будет осуществляться поиск по любому из полей (в крайне редких случаях ~0.5% — по нескольким сразу). Поиск должен осуществляться быстро (не смотря на пункт №3)
- К «главной» таблице скорее всего будут добавлены индексы к каждому из полей сразу для двух полей (ownerID и Имя поля т.к. ownerID будет указан во всех запросах). Быстрый поиск будет нужен по любому из полей, но это не столь приоритетная задача. (Или лучше использовать Sphinx?)
- Львиная доля запросов (~80%) на чтение к «главной» таблице — простые select'ы по индексам from и personalID с limit = 20. Остальные запросы по любым другим полям по индексам (которых пока нет) ownerID и Имя поля, также с limit = 20
- Изменения данных в записях «главной» таблицы будут происходить крайне редко. Никакие записи из таблицы удаляться не будут.
- Поддержка транзакций и внешних ключей не обязательна
- Нужна возможность репликации данных типа master-slave
- Возможность шардинга на уровне СУБД приветствуется
- Крайне важна надежность БД (т.е. такой крах, как у MyISAM с ручным восстановлением сразу отпадает)
- К «главной» таблице могут добавляться новые поля. Это конечно крайне редкое явление и далеко не самое важное требование, но добавление нового столбца к таблице размером с десяток ГБ для MySQL весьма длительный процесс, а выносить новые поля в отдельную таблицу очень не хочется
- Всё это по-началу будет крутиться на таком вот выделенном сервере
- Другие таблицы будут расти медленно, и обращения к ним будут достаточно редкими, за них я не переживаю. Часто обновляемые данные у меня крутятся в redis'e
Структура «главной» таблицыCREATE TABLE IF NOT EXISTS `clients` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`personalID` int(11) NOT NULL,
`ownerID` int(11) NOT NULL,
`fromID` int(11) NOT NULL DEFAULT '4',
`fromDomain` varchar(255) NOT NULL,
`datetime` datetime NOT NULL,
`status` int(11) NOT NULL DEFAULT '0',
`paid` tinyint(1) NOT NULL DEFAULT '0',
`paymentType` tinyint(4) NOT NULL DEFAULT '1',
`wmSum` float NOT NULL DEFAULT '0',
`wmCommission` float NOT NULL DEFAULT '20',
`sysNumber` varchar(14) NOT NULL,
`sysNumberLastUpdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`sysNumberStatus` varchar(250) NOT NULL,
`timezone` float NOT NULL,
`comment` varchar(500) NOT NULL,
`countryID` int(11) NOT NULL,
`postIndex` varchar(6) NOT NULL,
`region` varchar(500) NOT NULL,
`city` varchar(500) NOT NULL,
`address` varchar(500) NOT NULL,
`fio` varchar(500) NOT NULL,
`phone` varchar(15) NOT NULL,
`email` varchar(255) NOT NULL,
`price` float NOT NULL,
`quantity` int(11) NOT NULL DEFAULT '1',
`label` varchar(30) NOT NULL,
`tag` int(11) NOT NULL,
`ip` varchar(15) NOT NULL,
`referer` varchar(200) NOT NULL,
PRIMARY KEY (`id`),
KEY `from` (`ownerID`,`fromID`),
KEY `paid` (`paid`),
KEY `status` (`status`),
KEY `label` (`label`),
KEY `sysNumberLastUpdate` (`sysNumberLastUpdate`),
KEY `personalID` (`ownerID`,`personalID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
P.S. Желающих отправить меня гуглить прошу даже не отвечать. Найти информацию по сравнению актуальных версий разных СУБД мне не удалось, а изучать возможности, плюсы и минусы PostgreSQL, Microsoft SQL Server и MariaDB для человека, который с ними не работал весьма долгая задача. Да и в MySQL я далеко не эксперт, и подобный крупный проект для меня дело новое, да и возможности MySQL от версии к версии отличаются. Единственное, что я точно знаю, так это то, что таблицы типа MyISAM в MySQL мне точно не подойдут