我有一个大数据集(约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服务器和数据库服务器。
谢谢!
您有一个称为`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