最好的存储引擎数据库与10,000,000行


Best storage engine for database with 10,000,000 rows

我有一个数据库表,有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的合理配置是什么?

提前感谢:)

您是否在acv_return_viadetails字段上有索引?

如果你想加快导入速度,我刚刚用c++编写了一个程序,可以在65秒内将一个300MB的文件导入mysql。也许你可以把它改编一下供你使用。

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

几点建议:

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条记录,加载所有的ids只需要几百mb。

$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;";