Переглядаючи список доступних функцій на веб- сайті http://dev.mysql.com/doc/refman/5.1/uk/memory-storage-engine.html, вискакують дві можливі проблеми:
- Жодна транзакція чи підтримка FK, тобто вам доведеться керувати цілісністю транзакцій та референтною цілісністю у власному коді (що може виявитись набагато менш ефективним, ніж дозволяти БД робити це за вас, хоча це дуже залежить від вашої програми очікувані моделі поведінки).
- Блокування лише рівня таблиці: це може бути суттєвим бар'єром для масштабованості, якщо вашій програмі потрібні кілька одночасних авторів запису в одному наборі таблиць або у випадках, коли ваші операції з читання використовують блокування для забезпечення послідовного зчитування даних - у таких випадках таблиця на основі диска, яка підтримує набагато більш тонку деталізацію блокування, вона буде працювати набагато краще, якщо достатньо її вмісту буде кешовано в оперативній пам'яті.
Крім цього, якщо припустити, що у вас є достатня кількість оперативної пам’яті, таблиця на основі пам’яті повинна бути швидшою, ніж дискова. Очевидно, що вам потрібно брати до уваги знімки на диску, щоб вирішити питання про те, що відбувається, коли екземпляр сервера буде скинутий, що, ймовірно, повністю знизить загальну користь від продуктивності, якщо дані потребують частого захоплення (якщо ви можете жити з втратою дня Дані в такому екземплярі ви можете просто робити резервну копію раз на день, але в більшості випадків це буде неприйнятно).
Альтернативою може бути:
- Використовуйте на основі дискових таблиць, але переконайтеся, що у вас є більш ніж достатня оперативна пам’ять, щоб утримати їх усіх в оперативній пам’яті в будь-який момент часу (і «достатня кількість оперативної пам’яті» може бути більше, ніж ви думаєте, як вам потрібно враховувати будь-які інші процеси на машині, ОС Буфери IO / кеш тощо)
- Скануйте весь вміст (усі дані та сторінки покажчиків) таблиці під час кожного запуску, щоб попередньо завантажити вміст у пам'ять
SELECT * FROM <table> ORDER BY <pkey fields>
для кожної таблиці, а потім SELECT <indexed fields> FROM <table> ORDER BY <index fields>
для кожного індексу
Таким чином, всі ваші дані знаходяться в оперативній пам’яті, вам потрібно лише турбуватися про продуктивність вводу / виводу для операцій запису. Якщо загальний робочий набір вашої програми набагато менший, ніж весь БД (що зазвичай так - у більшості додатків більшість користувачів буде дивитись лише найновіші дані, якщо час), можливо, ви будете більш вибіркові щодо того, наскільки ви скануєте для попереднього завантаження в пам'ять, дозволяючи решта завантажуватися з диска на вимогу.