我在mac pro上运行一个mysql服务器,64GB内存,6个内核。我的架构中的表1有3.3亿行。表2有65,000行。 (我还有其他几个表总共大约15亿行,但它们并没有用在我正在尝试的操作中,所以我认为它们不相关)。
我正在尝试做一些我认为是一个相对简单的更新语句(见下文),将表2中的一些数据带入Table1。然而,我有一个糟糕的时间,mysql吹过我的系统ram,迫使我进行交换,并最终冻结整个系统,以便mysql变得反应迟钝,我需要重新启动我的电脑。我的更新声明如下:
UPDATE Table1, Table2
SET
Table1.Column1 = Table2.Column1,
Table1.Column2 = Table2.Column2,
Table1.Column3 = Table2.Column3,
Table1.Column4 = Table2.Column4
WHERE
(Table1.Column5 = Table2.Column5) AND
(Table1.Column6 = Table2.Column6) AND
(Table1.Column7 = Table2.Column7) AND
(Table1.id between 0 AND 5000000);
最终,我想对Table1中的所有3.3亿行执行此更新。我决定将它分成500万行,但是因为
以下是有关情况的更多相关细节:
因此,我想知道:
答案 0 :(得分:0)
因此,在咨询了几位了解此类问题的人之后,我提出了以下解决方案:
我把innodb_buffer_pool_size降到了4GB,即我整个系统内存的1/16。这最终似乎足以可靠地阻止MySQL通过我的64GB内存。
我简化了我的索引,以便它们只包含我需要的列,并确保我使用的所有索引都足够小以适应RAM(有足够的空间来备用RAM的其他用途) MySQL也是如此。
我学会了接受MySQL似乎并不是为特别大的数据集构建的(或者,至少不是在一台机器上,即使是像我这样的相对较大的机器)。因此,我接受了手动分解我的工作往往是必要的,因为显然MySQL的机制并没有做出正确的决定如何自己打破工作的顺序,以便要认真对待像RAM这样的系统资源。
有时候,当我按照这个或者一般来说,在我适度大的数据集上做工作时,我会使用MySQL来做我的更新和加入。其他时候,我只是将数据分成几块,然后在另一个程序中进行连接或其他此类操作,例如R(通常使用像data.table这样的包,可以相对有效地处理大数据)。
我还被告知,或者,我可以在Hadoop集群上使用类似Pig of Hive的东西,它应该能够更好地处理这种大小的数据。