具有10,000,000行的数据库的最佳存储引擎

时间:2011-11-13 08:10:12

标签: php mysql innodb myisam

我有一个包含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收集到一个名为$ ids的数组中,我处理记录并将数据写入CSV文件,以便在每1000行的末尾导入。 然后我用:

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

由于以上是对表的唯一写入,因此我每次都选择所有字段。我应该使用内存表还是其他类型的存储引擎来加快速度?或者我可以引入任何其他可以加速的优化吗?

对于这样的操作,这也是一个合理的my.cnf配置。

提前致谢:)

2 个答案:

答案 0 :(得分:1)

你在acv_return_viadetails字段上有索引吗?

如果您正在考虑加快导入,我只是用C ++编写了一个程序,在65s内将一个300MB的文件导入到mysql中。也许你可以根据自己的需要进行调整。

请参阅https://github.com/homer6/import-geoip-data

答案 1 :(得分: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)检查是否可以在没有1000限制的情况下一次加载所有ids。使用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;";