我正在考虑放置将 MySQL 数据库的 tempdir 复制到 ramdisk 上在 Linux 下。这样做的原因是为了解决内存临时表最大为 4 GB在 MySQL 中。我唯一担心的是,如果 ramdisk 上基于 MyISAM 的临时表变得比 ramdisk 大,如何避免磁盘空间不足错误?是否可以以某种方式创建溢出机制,其中 ramdisk 大小是 ramdisk 的大小加上硬盘上的可用空间。如果 ramdisk 已满,其余部分将写入硬盘。
答案1
从逻辑上思考这个问题并忽略它是一个 RAM 支持的虚拟磁盘的事实:您要求一个变得更大的磁盘设备,因为您试图在其上存储更多的东西。
你祈求祝福 +30手提袋。
你要求的是次元洞。
你要求的是塔迪斯(“里面更大”)。
你在要求一些不存在的东西。至少就我所见而言不存在...
使用 tmpfs/RAM 支持的存储来存储临时表是一种非常优雅的方式来绕过 4GB 的限制。但请注意,您锁定的 RAM 将无法供 MySQL 执行SORT
ing、JOIN
ing 等操作,因此您需要大量的 RAM 来实现这一点 - 您需要 tmpfs 足够大,以便随时容纳您所需的尽可能多的临时表(可能相当大),并且您还需要有足够的剩余 RAM,以便在运行大型查询时不会进行交换(否则您的性能无论如何都会下降,因为必须交换进和交换出某些内容!)。
更实际的解决方案可能是巧妙地设计显式(和高效)的JOIN
s 以消除对临时表的需求(如果可能),并将它们保存为视图。如果不了解您的环境,我无法为您提供具体指导,但您可以随时询问DBA 站点提供一些关于您正在做的事情的基本细节,看看他们是否有建议......
(我很抱歉给大家带来坏消息,但如果这有任何价值的话,我确实很高兴打出这个答案。)
答案2
理论上,我猜您可以使用 ramdisk 和硬盘中的物理卷创建一个 JBOD 文件系统 - 但我不确定它是否会先自动填满 ram 磁盘。本文档可能会对这个话题有更多启发
答案3
最好的办法是购买 64GB SSD 并将其放在tempdir
上面,无需其他操作。它们很便宜,大约每 GB 1 美元(打折),因此,只要约 64 美元和每 GB 2 美元(非打折),您就可以拥有超快的速度,tempdir
而不必担心尺寸太小。