正确使用 MySQL 内存表提高性能

Proper use of MySQL Memory Tables for performance

我有一个有 60 列(和数千行)的 table,它引用了 15 个目录 tables,其中 3 个引用了另外 3 个目录 tables (整个数据库小于 1 GB)。这些 table 用于在网络应用程序中执行一些 "onchange" 搜索查询(我的意思是用户 select 或在屏幕上的 select/input 字段中写入值,并自动更新结果,直到 he/she 找到要查找的内容)。

如您所料,此搜索查询执行频繁,因此 MySQL 很难获取结果(目前有 10 个并发用户...)。

我意识到仅针对此查询使用内存 tables(原始 tables 的副本)是一个不错的选择,但我从未处理过这些类型的 tables。我不知道如何管理这些 table 中的 insert/update/delete。我是否必须执行这些操作两次(一次在内存 table 中,一次在原始 table 中)?我这样做没有问题,但是有 another/better 方法吗?

我了解内存 table 的大小限制(我可以更改 max_heap_table_size)以及如果系统崩溃(使用 init_file 重新填充 table)而且我有足够的 RAM 内存(系统只使用 6 GB 安装的 16 GB)。在使用这些 tables 时,我还需要考虑另一件事吗?

如果你的整个数据库都适合 innodb_buffer_pool_size,变化是 ENGINE=MEMORY 实际上会更慢,特别是如果你有任何写入进入它,因为 MEMORY 引擎具有与 MyISAM 相同的锁定特性(table 写入级别锁定)。因此,在所有数据都适合缓冲池的只读工作负载中,InnoDB 性能应该相似。在读写工作负载中,InnoDB 将大大优于它。

一定要测试它的具体用途。但是不要惊讶地发现它实际上比您的工作量慢。