我有一个100万行的CSV数据库,我正在使用以下Seeder将其摄取到Laravel中:
public function run()
{
DB::table("terms")->truncate();
DB::beginTransaction();
$csvFile = fopen(base_path("database/terms.csv"), "r");
while (($data = fgetcsv($csvFile, 100, ",")) !== FALSE) {
DB::table("terms")->insert([
"serial" => $data['0'],
"output" => $data['1']
]);
}
fclose($csvFile);
DB::commit();
}
这是播种机正在运行的迁移:
public function up()
{
Schema::create('items', function (Blueprint $table) {
$table->mediumIncrements("id");
$table->string("serial")->unique();
$table->string("output");
});
$seeder = new ItemsSeeder();
$seeder->run();
}
我不能使用分块,因为为数据创建Eloquent模型对我来说没有意义,所以我使用数据库事务来提高性能(这将摄取时间从一个小时减少到半个小时)。作为一个解决方案,这很好用,除了它向表中额外添加了几百行。更奇怪的是,当我颠倒排序顺序检查最后一行时,如预期的那样,它的id
为1000000
(一百万),这表明没有添加额外的行。
这是怎么回事?
1条答案
按热度按时间q3qa4bjr1#
你凭什么认为你有多余的行?
如果您按照 “tool” 中显示的行计数进行操作,它可能显示的是SHOW TABLE STATUS返回的近似行计数。
SELECT COUNT(*) FROM terms
是否返回您所期望的1M?