Глядя на список доступности функций по адресу http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html, выявляются две возможные проблемы:
- Никакой поддержки транзакций или FK, что означает, что вам придется управлять целостностью транзакций и ссылочной целостностью в вашем собственном коде (что может оказаться гораздо менее эффективным, чем позволить БД сделать это за вас, хотя это очень зависит от вашего приложения). ожидаемые модели поведения).
- Только блокировка на уровне таблицы: это может стать серьезным препятствием для масштабируемости, если вашему приложению требуется несколько одновременных устройств записи для одного и того же набора таблиц или в тех случаях, когда ваши операции чтения используют блокировки для обеспечения согласованности чтения данных - в таких случаях таблица на основе диска поддерживает гораздо более тонкую гранулярность блокировки, будет работать намного лучше, если достаточно ее содержимого в настоящее время кэшируется в RAM.
Кроме этого, при условии, что у вас достаточно ОЗУ, таблица на основе памяти должна быть быстрее, чем таблица на основе диска. Очевидно, что необходимо учитывать моментальные снимки на диске, чтобы решить вопрос о том, что происходит при перезагрузке экземпляра сервера, что может полностью свести на нет выигрыш в производительности в целом, если данные нужно часто захватывать (если вы можете потерять день данные в таком случае вы можете просто делать резервную копию один раз в день, но в большинстве случаев это будет неприемлемо).
Альтернативой может быть:
- Используйте таблицы на основе дисков, но убедитесь, что у вас более чем достаточно ОЗУ для хранения их всех в ОЗУ в любой момент времени (и «достаточно ОЗУ» может быть больше, чем вы думаете, так как вам необходимо учитывать любые другие процессы на машине, ОС Буферы ввода-вывода / кэш и т. Д.)
- Сканирование всего содержимого (все страницы данных и индекса) таблицы при каждом запуске для предварительной загрузки содержимого в память
SELECT * FROM <table> ORDER BY <pkey fields>
для каждой таблицы, а затем SELECT <indexed fields> FROM <table> ORDER BY <index fields>
для каждого индекса
Таким образом, все ваши данные находятся в оперативной памяти, вам нужно беспокоиться только о производительности ввода-вывода для операций записи. Если общий рабочий набор вашего приложения намного меньше, чем вся БД (как это обычно бывает) - в большинстве приложений большинство пользователей будут смотреть только самые последние данные, если это время), возможно, вам лучше быть более избирательным в отношении того, насколько Вы сканируете для предварительной загрузки в память, позволяя остальным быть загружены с диска по требованию.