2011-11-13 29 views
0

我有一个包含10,000,000多行的数据库表,我正在创建一个新表。什么是最适合阅读的存储引擎类型?拥有10,000,000行数据库的最佳存储引擎

目前我使用:

$sql = "UPDATE `packages_unsorted` SET `acv_return_viadetails` = '0';"; 

然后选择记录:

$sql = "SELECT * FROM `packages_unsorted` WHERE `acv_return_viadetails` = '0' LIMIT 1000;"; 

我收集的主键id到一个数组名为$ id和我处理记录和数据写入每1000行结束时需要导入一个CSV文件。 然后我和更新acv_return_viadetails领域:

$sql = "UPDATE `packages_unsorted` SET `acv_return_viadetails` = '1' WHERE `id` IN ('".implode("','",$ids)."') LIMIT 1000;"; 

由于上面表中只写我选择每次各个领域。我应该使用内存表还是使用其他类型的存储引擎来加快速度?还是还有其他的优化可以让我加速呢?

此外,什么将是一个合理的my.cnf这种操作配置。

感谢提前:)

+1

如果你在调整你的MySQL安装寻找先进的技术,我会强烈建议http://www.mysqlperformanceblog.com /确定你可以做的所有调整。看不出为什么你不能只使用'InnoDb'并确保'acv_return_viadetails'具有'INDEX'。也许如果我们对数据集了解得更多一些,将它分解成更小的表或重新组织数据可能是有意义的。 –

+0

谢谢,我会尝试Innodb,但我不能真正地分割数据,因为它是使用LOAD DATA INFILE的直接CSV导入 - 约90个字段* 10M行。 –

+0

innodb - 聚集主键看到这里http://stackoverflow.com/questions/4419499/mysql-nosql-help-me-to-choose-the-right-one-on-a/4421601#4421601 –

回答

0

几点建议:

1)更换

$sql = "SELECT * FROM `packages_unsorted` WHERE `acv_return_viadetails` = '0' LIMIT 1000;"; 

$sql = "SELECT `id` FROM `packages_unsorted` WHERE `acv_return_viadetails` = '0' LIMIT 1000;"; 

2)检查是否有可能加载所有ids一次没有1000的限制。对于10M记录,应该只需要几百MB来加载所有ids

$sql = "SELECT `id` FROM `packages_unsorted`"; 

如果不是,请考虑增加限制。

3)你可以尝试像以下,而不是使用acv_return_viadetails

$sql = "SELECT `id` FROM `packages_unsorted` LIMIT 0, 1000;"; 
$sql = "SELECT `id` FROM `packages_unsorted` LIMIT 1000, 1000;"; 
$sql = "SELECT `id` FROM `packages_unsorted` LIMIT 2000, 1000;"; 
+0

谢谢我理解,但我需要从表格中的所有字段进行处理,所以我必须每次选择*。我也需要大块(1000),所以它释放MySQL服务器的查询其他表,所以我不能抓住所有的ID:( –

+0

也许你可以选择'ID',将它们存储在一个PHP列表和然后逐个处理它们,我相信抓住所有ID不应该花费太多资源。 – nikhil500

1

你对acv_return_viadetails领域的指数?

如果您正在加快导入速度,我只是用C++编写一个程序,在65秒内将一个300MB文件导入到mysql中。也许你可以适应它,供你使用。

https://github.com/homer6/import-geoip-data

+0

+1分享。你能告诉我什么是< and >在c + +手段:std :: auto_ptr temp_connection? – Bytemain

+0

这是一个模板。它允许你创建许多不同类型的类。例如,矢量创建了一个整数的向量(这是一个集合)。矢量创建了一个字符串向量。在你提到的情况下,它创建一个auto_ptr到一个sql :: Connection – Homer6

+0

是的我有一个'acv_return_viadetails'索引,但我只能访问服务器上的PHP,所以我不能使用C++应用程序。我会用它来做其他的事情:) –