如何优化我的查询以达不到最长时间执行时间?

时间:2018-04-07 01:57:35

标签: php mysql wordpress

我有一个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分钟,仍然无法处理所有数据。如何优化它并使其工作?或者甚至处理比我现在面临的更大的数据。感谢。

1 个答案:

答案 0 :(得分:0)

让数据库完成所有工作。

假设approval_url有自动增量ID字段,并且每个products只有一个product_titlebrand namebrand 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将尝试在匹配条件下加入左连接表。如果找到匹配,则加入它;如果未找到匹配项,则会为表的字段设置空值。 (在这种情况下,产品不会有空值的行。)

以第二个插页为例,制作第三个插页应该是微不足道的。