1

我有一个有 60 列(和数千行)的表,它引用了 15 个目录表,其中 3 个引用了另外 3 个目录表(整个数据库小于 1 GB)。这些表用于在 Web 应用程序中执行一些“onchange”搜索查询(我的意思是用户在屏幕上的选择/输入字段中选择或写入值,并自动更新结果,直到他/她找到寻找)。

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

我意识到仅对这个查询使用内存表(原始表的副本)将是一个不错的选择,但我从未处理过这些类型的表。我不知道如何管理这些表中的插入/更新/删除。我是否必须执行两次这些操作(一次在内存表中,一次在原始表中)?我没有问题可以这样做,但是,还有另一种/更好的方法吗?

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

4

1 回答 1

2

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

无论如何-针对您的特定用途对其进行测试。但是不要惊讶地发现它实际上对您的工作量来说更慢。

于 2020-05-06T16:39:28.833 回答