Добрый день. Есть такая структура данных:
{
key_number_1: {
key_date_1: [
{'min': 125,
'max': 300},
{'min': 10,
'max': 15},
{'min': 15,
'max': 20,}
...
{'min': 0,
'max': 10},
],
key_date_2: [
{'min': 125,
'max': 300},
...
{'min': 10,
'max': 15},
],
...
key_date_3: [
{'min': 600,
'max': 800},
...
{'min': 90,
'max': 100},
],
}
key_number_2: {
key_date_1: [
{'min': 10,
'max': 40},
...
{'min': 0,
'max': 10},
],
key_date_2: [
{'min': 125,
'max': 300},
{'min': 10,
'max': 15},
],
...
key_date_3: [
{'min': 600,
'max': 800},
...
{'min': 110,
'max': 111},
}
}
Мне нужно извлекать по key_number_* и key_date_* все или часть элементов, которые находятся на третьем уровне. Т.е. словари {min: ..., max: ...}
Решением «в лоб» было создание одной «плоской» таблицы с такой структурой:
В качестве СУБД использую MySQL, тип таблицы — MyISAM. Сделал составные индексы (number date). Текущий размер таблицы около 12 ГБ, количество строк около 200 млн. Выборка происходит очень долго.
Одной из идей как увеличить быстродействие было разнести данные по key_number_* и key_number_ в отдельные таблицы. Название таблиц — Table{$key_number}_{$str_key_date}. От этой идеи отказался, так как будет трудно делать выборку по key_number_*, игнорируя key_number_* из-за того, что появится куча таблиц, названия которых придется получать, как-то отделять номер от даты.
Сейчас смотрю в сторону нереляционных баз данных, в которых можно будет извлекать нужные данные по нужным мне ключам.
Сейчас выбираю себе нереляционное СУБД. Пока что по документации:
- Redis — простая БД для хранения ключ -> значение;
- CouchDB — умеет хранить данные в формате JSON, но не понятно, может ли быстро извлекать данные;
- MongoDB — судя по документации, у меня сложилось впечатление, что эта штука нужна для создания «плоских» таблиц без структуры. По идеи можно перенести данные с MySQL, но не думаю, что быстродействие увеличится.
Собственно вопрос в том, какую СУБД мне выбрать?