MySQL定价表中的大量连续(重新)导入和刷新数据

问题描述 投票:1回答:1

我有一个大数据集(约250万行),需要将其连续(重新)导入MySQL表“ price_list”。所有表都是InnoDB。当前,我正在使用“ LOAD DATA LOCAL INFILE”,因为这些数据集来自csv文件:

LOAD DATA LOCAL INFILE 'sample.csv'
INTO TABLE `price_list`
(...)
(...)
IGNORE 1 LINES

[db“ price_list”中的表示例:

hotel_id | room_category            | price 1 person | price 2nd person     | <other meta info>

1        | single room (w/o window) | 150€           | 200€                 | ...
2        | single room (w window)   | 170€           | 220€                 | ...
3        | single room (rooftop)    | 240€           | 250€                 | ...
4        | single room (whirlpool)  | 200€           | 280€                 | ...
5        | double room (w/o window) | 200€           | 220€                 | ...
6        | double room (w window)   | 240€           | 260€                 | ...
7        | double room (rooftop)    | 280€           | 300€                 | ...
8        | double room (whirlpool)  | 320€           | 340€                 | ...
(...)

基于此数据,我需要以更新的价格更新表“ offers”(该表位于另一个数据库中,该用户位于“ price_list”中,无法访问“ offers”,并且从技术上讲,它无法提供正确的访问权限)。价格变化很大,我们需要每15分钟重新导入一次这些数据。

id  |       offer_name           |   price_single_room    |    price_double_room
1   |  WHIRLPOOL OFFER SINGLES   |         200€           |          200€

在上面的示例中,选择了“最佳”单人间(带漩涡浴缸)的价格(200欧元)。此报价中不需要第二价格,但第二价格是有意计算的(如果需要,可以取消激活)。

我当前的解决方案是,我从PHP的“ offers”表中获取了所有报价,这些报价被标记为有效,然后遍历它们(oof)。每个报价都有6个不同价格的列(例如,酒店有不同的房间;第1列是单人间的最佳价格,第2列是双人间的最佳价格,...)。

当前,我们有大约10.000个有效要约,这意味着我将向数据库服务器发送以下金额:10.000个查询* 6个查询,以查找每个要约的最佳定价。

[当我在同一台服务器上执行这些查询时(没有网络延迟等),性能并不是最差的(整个工作大约需要5分钟(导入约250万行,刷新价格,...)),但是由于随着数据的增长,我们希望拆分数据库和Web服务器。我现在意识到,要刷新价格的那部分会产生大量网络开销,并且速度很慢,因为从Web服务器到数据库服务器的每个请求都需要大约0.025s(仅25分钟用于刷新价格)。

我考虑了以下解决方案:

  • 将表“ offers”移动到同一数据库“ price_list” =正常工作,但是仍然很慢,因为数据库服务器与Web服务器不在同一台计算机上=网络延迟是瓶颈。

  • 编写一个存储过程,该过程由PHP触发,数据库服务器完成该工作。

有人对这些重复发生的数据负载有经验,也许可以解决我给定的问题?目标是减少时间安排并拆分Web服务器和数据库服务器。

谢谢!

php mysql import bigdata rdbms
1个回答
0
投票

您有一个称为`real的表;以下将替换为包含新数据的新表。

CREATE TABLE t_new LIKE real;
LOAD DATA INFILE new ...;
RENAME TABLE real TO t_old,
             t_new TO real;
DROP TABLE t_old;

注意:

⚈  The LOAD DATA step can be replaced by whatever process you have for importing the data.
⚈  The Loading is the only slow step.
⚈  The RENAME is atomic, so real always exists.
⚈  You may choose to delay the DROP in case the new data might be bad and you want to revert.
⚈  FOREIGN KEYs can be a hassle; it might be good not to have such.

-http://mysql.rjweb.org/doc.php/deletebig#optimal_reload_of_a_table

© www.soinside.com 2019 - 2024. All rights reserved.