我有一个100k行的临时表。它来自一个csv文件,我使用LOAD DATA LOCAL INFILE
将它放在临时表中,我需要处理这些原始数据,因为它有重复。所以我制作了3个产品,product_images和product_description表来处理原始数据并将其放在那里。
我的示例代码:
将原始产品插入产品表
$data = $this->getRawDistinct(); // raw data I used sql group by here and get 2000 data
$insertedID = [];
foreach (array_chunk($data, 1000) as $key => $values) {
foreach($values as $value) {
$this->db->insert("{$this->prefix}products", [
'name' => $value['product_title'],
'brand_name' => $value['brand_name'],
'brand_logo' => $value['brand_logo_image'],
'status' => $value['product_status'],
'keywords' => $value['keywords'],
]);
array_push($insertedData, $this->db->insert_id); // store inserted data id
}
}
将原始产品插入product_image和product_description
$processedProduct = $this->db->get_results(
"SELECT id, name " .
"FROM {$this->prefix}products " .
"WHERE id IN ( ".implode(",", $insertedData)." ) "); // Get the data of those inserted earlier
foreach ($processedProduct as $key => $value) {
$rawProducts = $this->db->get_results(
"SELECT * " .
"FROM {$this->prefix}raw_products " .
"WHERE product_title = '$value->name'");
if($rawProducts) {
foreach ($rawProducts as $rawProduct) {
//insert to product_image
$this->db->insert("{$this->prefix}product_images", [
'product_id' => $value->id,
'thumbnail' => $rawProduct->thumbnail_image,
'color_swatch' => $rawProduct->color_swatch_image,
'product_image' => $rawProduct->product_image,
'front_flat' => $rawProduct->front_flat,
'back_flat' => $rawProduct->back_flat,
'front_model' => $rawProduct->front_model,
'back_model' => $rawProduct->back_model,
'side_model' => $rawProduct->side_model,
'three_q_model' => $rawProduct->three_q_model,
'color_square_image' => $rawProduct->color_square_image,
'color_product_image' => $rawProduct->color_product_image,
]);
//insert to product_descriptions
$this->db->insert("{$this->prefix}product_descriptions", [
'product_id' => $value->id,
'size' => $rawProduct->size,
'piece_weight' => $rawProduct->piece_weight,
'piece_price' => $rawProduct->piece_price,
'dozen_price' => $rawProduct->dozen_price,
'case_price' => $rawProduct->case_price,
'piece_sale_price' => $rawProduct->piece_sale_price,
'dozen_sale_price' => $rawProduct->dozen_sale_price,
'case_sale_price' => $rawProduct->case_sale_price,
'inventory_key' => $rawProduct->inventory_key,
'size_index' => $rawProduct->size_index,
'catalog_color' => $rawProduct->catalog_color,
'price_code' => $rawProduct->price_code,
'catalog_color' => $rawProduct->catalog_color,
]);
}
}
}
正如您在代码中看到的那样,我首先区分记录并获取2k数据,因为这些是我需要放在产品表中的产品。
不要得到100k的融合然后它来到2k,其他记录是重复的,因为它创建了另一行,用于不同的尺寸,颜色,图像等仅与一种产品有关。那些尺寸,图片我需要它插入到product_image和product_description中,两者都应该有100k记录。
将原始产品插入产品表工作正常但是将原始产品插入到product_image和product_description它插入数据但不是全部因为我达到最大时间执行而我已经增加到5分钟但是我不喜欢那样因为用户只需5分钟,仍然无法处理所有数据。如何优化它并使其工作?或者甚至处理比我现在面临的更大的数据。感谢。
答案 0 :(得分:0)
让数据库完成所有工作。
假设approval_url
有自动增量ID字段,并且每个products
只有一个product_title
,brand name
,brand logo
和{{1} } value:
status
现在我们应该有一个带有keywords
字段的好产品表(自动增量字段)。现在,我们需要创建关系表INSERT INTO products
SELECT DISTINCT product_title name, brand_name, brand_logo_image brand_logo, product_status status, keywords
FROM raw_products
和product_id
。 (注意,这些与对方之间是否存在1:1的关系?为了论证,我们假设他们没有,并且你已经确定他们需要分开)
product_images
左连接是这里的魔力。对于每一行原始产品,db将尝试在匹配条件下加入左连接表。如果找到匹配,则加入它;如果未找到匹配项,则会为表的字段设置空值。 (在这种情况下,产品不会有空值的行。)
以第二个插页为例,制作第三个插页应该是微不足道的。