使用17亿条记录优化MySQL脚本

时间:2018-11-16 09:47:10

标签: mysql

我正在尝试优化我创建的MySQL脚本。这是项目的一些背景。

我们有2个系统,我们现在将它们合并为一个系统,我目前正在编写脚本以将数据库合并在一起。我需要它尽可能快地运行,而在运行此脚本时,我们必须关闭系统,我们不希望停机时间太长。

这两个系统都有一个称为场所,区域和device_vendor的表,它们相同,只是具有不同的数据。当我将表合并在一起时,这些表中的值的ID显然已更改,并且它们是许多其他表中的外键。我当前正在处理的表有17亿条记录,并且所有值都具有场所ID,区域ID和设备_供应商ID,因此我必须将这些值更改为新ID。

这是我编写的将ID更改为新值的脚本。所有这些值也是索引,这就是为什么要花费这么长时间的原因。

INSERT INTO `intelli_sense`.`tracking_daily_stats_zone_unique_device_uuids_per_hour` (day_epoch, day_of_week, hour, venue_id, zone_id, device_uuid, device_vendor_id, first_seen, last_seen, is_repeat)

SELECT day_epoch, day_of_week, hour, (CASE WHEN intelli_sense_venue.id!=0 THEN intelli_sense_venue.id ELSE 0 END), (CASE WHEN intelli_sense_zone.id!=0 THEN intelli_sense_zone.id ELSE 0 END), device_uuid, (CASE WHEN intelli_sense_device_vendor.id!=0 THEN intelli_sense_device_vendor.id ELSE 0 END), first_seen, last_seen, is_repeat
FROM geo_sense.daily_stats_zone_unique_device_uuids_per_hour AS tracking_daily_stats_zone_unique_device_uuids_per_hour
LEFT JOIN geo_sense.venue AS tracking_venue ON tracking_venue.id = tracking_daily_stats_zone_unique_device_uuids_per_hour.venue_id
LEFT JOIN intelli_sense.venue AS intelli_sense_venue ON intelli_sense_venue.name = tracking_venue.name
LEFT JOIN geo_sense.zone AS tracking_zone ON tracking_zone.id = tracking_daily_stats_zone_unique_device_uuids_per_hour.zone_id
LEFT JOIN intelli_sense.zone AS intelli_sense_zone ON intelli_sense_zone.name = tracking_zone.name AND intelli_sense_zone.lat = tracking_zone.lat AND intelli_sense_zone.lon = tracking_zone.lon
LEFT JOIN geo_sense.device_vendor AS tracking_device_vendor ON tracking_device_vendor.id = tracking_daily_stats_zone_unique_device_uuids_per_hour.device_vendor_id
LEFT JOIN intelli_sense.device_vendor AS intelli_sense_device_vendor ON intelli_sense_device_vendor.name = tracking_device_vendor.name AND intelli_sense_device_vendor.description = tracking_device_vendor.description;

从上面的脚本中可以看到,我已经使用LEFT JOINS来更新这些值。我基本上已经将两个数据库都导入到一台服务器中,现在将它们合并在一起以创建一个名为intelli_sense的新数据库。

在上面的脚本中,这并没有将2个数据库合并在一起,而只是更新了来自geo_sense数据库的tracking_daily_stats_zone_unique_device_uuids_per_hour表中的值,因为合并了场所,区域和device_vendor表后,ID已更改。我需要更新与那些表相关的所有表。

我已经运行了该脚本,花了3天的时间插入了5000万条记录,这很长,所以我停止了它。

我需要此脚本在不到一天的时间内完成,因为我有3个表,并拥有如此多的数据,并且我不希望系统停机时间过多。

我无法共享数据,因为有太多内容,所以我希望脚本能对它进行足够的解释,实际的脚本只是为了加速它而工作。数据也是个人数据,所以我还是无法共享它。

如果您认为不可能做到这一点,请告诉我,我将找到一种新的方法来使两个系统都处于打开状态,这样它可能需要的时间就可以了。

谢谢。

编辑以下是上述查询的解释性声明。 Explain Statement

0 个答案:

没有答案