2016-05-17 2 views
1

У меня есть требование, когда мне нужно создать базу данных Cache-Layer for MySQL. База данных огромна, и в ней насчитывается около 100 таблиц и миллионов строк. Почти все таблицы имеют отношения с внешним ключом. Например:Queriable Cache для MySQL

Таблица: Правило

CREATE TABLE `rule` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `code` varchar(256) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `idx_rule_code` (`code`) 
) 

Таблица: Params

CREATE TABLE `params` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `rule_id` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `rule_id` (`rule_id`), 
    CONSTRAINT `params_ibfk_1` FOREIGN KEY (`rule_id`) REFERENCES `rule` (`id`) 
) 

Я могу хранить строки правил таблицы с ключом и аналогично для таблицы Params отдельно. Теперь я хочу, чтобы получить строки из обеих таблиц, используя какой-то где условия, похожее на это:

Select * from rule r, params p where r.id = p.rule_id and r.id = (some_value); 
  1. Есть ли способ, где я могу кэшировать данные, а также выполняет присоединяется на ней (в основном работает? приведенный выше запрос в кеше)

  2. Что я должен использовать для кеширования для этого? Aerospike, Redis, MongoDB и т.д.,

  3. Можете ли вы дать общее представление моего класса-оболочки, который выполняет описанную выше операцию (1) для реализации этого

+0

MySQL имеет встроенный кеш, поэтому, возможно, было бы разумнее начать с попытки его настроить? https://www.percona.com/blog/2015/01/02/the-mysql-query-cache-how-it-works-and-workload-impacts-both-good-and-bad/ http://dev.mysql.com/doc/refman/5.7/en/query-cache-configuration.html – michaJlS

+0

@ MichałSznurawa Проблема в том, что получаемые данные большие (около 30 Мб), а используемые таблицы обновляются очень часто (около 3 обновлений/сек), поэтому невозможно использовать встроенный кеш –

+0

вы можете написать что-то больше о том, как используются данные? Как часто читается, и если вам нужно получить самую свежую копию? – michaJlS

ответ

0

Вы продемонстрировали, что есть проблема? Основываясь на том, что вы сказали, вы сталкиваетесь с фактором 30 из-за каких-либо проблем с производительностью. Вы можете (возможно) сделать 100, а не только 3, обновления в секунду и одновременно делать сотни (не 0,33) чтений в секунду.

Вам необходимо, чтобы innodb_buffer_pool_size было установлено около 70% от доступно ram.

Запрос (с JOIN), который вы представили, не представляет проблемы, учитывая предоставленные индексы.

Если у вас есть проблемы с производительностью, вы не указали никаких доказательств.