Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/MySQL-每周更新7000万行_Php_Mysql_Sql - Fatal编程技术网

PHP/MySQL-每周更新7000万行

PHP/MySQL-每周更新7000万行,php,mysql,sql,Php,Mysql,Sql,我有一个数据库,里面有7000多万行。这些数据最初是从大约70000个XML文件中解析和导入的。这些文件每周更新一次,因此我需要扫描这些XML文件(周日凌晨2点通过cron),并更新已更改的行/插入新行 $operatorSQL = "INSERT IGNORE INTO `operator` (`reference`, `national_operator_code`, `operator_code`, `operator_short_name`, `operator_name_on_lice

我有一个数据库,里面有7000多万行。这些数据最初是从大约70000个XML文件中解析和导入的。这些文件每周更新一次,因此我需要扫描这些XML文件(周日凌晨2点通过cron),并更新已更改的行/插入新行

$operatorSQL = "INSERT IGNORE INTO `operator` (`reference`, `national_operator_code`, `operator_code`, `operator_short_name`, `operator_name_on_license`, `trading_name`) VALUES (:reference, :nationalOperatorCode, :operatorCode, :operatorShortName, :operatorNameOnLicense, :tradingName);";
$serviceSQL = "INSERT IGNORE INTO `service` (`service_code`, `private_code`, `date_start`, `date_end`, `mode`, `description`, `origin`, `destination`) VALUES (:serviceCode, :privateCode, :dateStart, :dateEnd, :mode, :description, :origin, :destination);";
$serviceOperatorSQL = "INSERT IGNORE INTO `service_operator` (`service_code`, `operator_reference`) VALUES (:serviceCode, :operatorReference);";
$journeyPatternSQL = "INSERT IGNORE INTO `journey_pattern` (`reference`, `direction`, `destination_display`, `vehicle_type_code`, `vehicle_type_description`) VALUES (:reference, :direction, :destinationDisplay, :vehicleTypeCode, :vehicleTypeDescription);";
$journeyPatternRouteSQL = "INSERT IGNORE INTO `journey_pattern_route` (`journey_pattern_reference`, `route_reference`) VALUES (:reference, :routeReference);";
$journeyPatternSectionLink = "INSERT IGNORE INTO `journey_pattern_section_link` (`journey_pattern_reference`, `journey_pattern_section_reference`) VALUES (:reference, :journeyPatternSectionReference);";
$journeyPatternSectionSQL = "INSERT IGNORE INTO `journey_pattern_section` (`reference`) VALUES (:reference);";
$lineSQL = "INSERT IGNORE INTO `service_line` (`service_code`, `name`) VALUES (:serviceCode, :name);";
$timingLinkSQL = "INSERT IGNORE INTO `journey_pattern_timing_link` (`reference`, `stop_from`, `stop_from_timing`, `stop_from_sequence_number`, `stop_from_activity`, `stop_to`, `stop_to_timing`, `stop_to_sequence`, `stop_to_activity`, `run_time`, `direction`) VALUES (:reference, :stopFrom, :stopFromTiming, :stopFromSequenceNumber, :stopFromActivity, :stopTo, :stopToTiming, :stopToSequenceNumber, :stopToActivity, :runTime, :direction)";
$timingLinkJpsSQL = "INSERT INTO `journey_pattern_timing_link_jps` (`journey_pattern_timing_link`, `journey_pattern_section_reference`) VALUES (:linkReference, :sectionReference);";
$timingLinkRouteLinkRefSQL = "INSERT INTO `journey_pattern_timing_link_rlr` (`journey_pattern_timing_link`, `route_link_reference`) VALUES (:linkReference, :routeLinkReference);";
$routeSQL = "INSERT IGNORE INTO `route` (`reference`, `private_code`, `description`) VALUES (:reference, :privateCode, :description);";
$routeSectionSQL = "INSERT IGNORE INTO `route_section` (`reference`) VALUES (:reference);";
$routeLinkSQL = "INSERT IGNORE INTO `route_link` (`reference`, `stop_from`, `stop_to`, `direction`, `distance`) VALUES (:reference, :stopFrom, :stopTo, :direction, :distance);";
$routeLinkSectionSQL = "INSERT INTO `route_link_section` (`route_link_reference`, `route_section_reference`) VALUES (:routeLinkReference, :routeSectionReference);";
$vehicleJourneySQL = "INSERT IGNORE INTO `vehicle_journey` (`reference`, `private_code`, `departure`) VALUES (:reference, :privateCode, :departure);";
$vehicleJourneyServiceSQL = "INSERT IGNORE INTO `vehicle_journey_service` (`vehicle_journey_reference`, `service_reference`) VALUES (:reference, :serviceRef);";
$vehicleJourneyLineSQL = "INSERT IGNORE INTO `vehicle_journey_line` (`vehicle_journey_reference`, `service_line_reference`) VALUES (:reference, :lineRef);";
$vehicleJourneyJpSQL = "INSERT IGNORE INTO `vehicle_journey_jp` (`vehicle_journey_reference`, `journey_pattern_reference`) VALUES (:reference, :journeyPatternRef);";
以上是执行的所有SQL查询。您会注意到,
INSERT
语句中使用了
IGNORE
子句,这只是为了确保如果任何文件有重复数据,没有错误会停止脚本,而只是忽略它并继续


我不认为这是最有效的方法,但是当我在对所有数据进行初始插入后再次运行脚本时,它的速度与执行原始插入时一样慢。。。当然,如果99.9%的行是相同的,它应该略过?知道为什么会发生这种情况吗?

查询优化通常用于选择、更新和删除查询。您只是将数据插入表中,这意味着不需要进行查询优化;引擎不必制定复杂的计划来将数据推送到表中。它执行插入的速度只是CPU、硬盘速度、I/O网络带宽等因素的函数。您插入的数据在任何意义上都不会被缓存,因此,如果您再次插入,将以相同的速率进行插入。

首先,我将确定性能问题是XML解析还是数据库。如果运行该程序而不调用数据库,会发生什么情况?它所花费的时间是否比数据库调用所花费的时间要少得多

如果是数据库,我会做以下工作,如果合理地考虑到您数据的性质:

  • 如果可能,将任务分成多个数据传递,每个传递代表一个表的
    INSERT
    s值
  • 在面向性能的数据结构中为表中的所有记录读取并缓存足够的密钥信息,以便您可以在内存中执行“我是否有记录”检查
  • 对于在输入中找到的每个记录,如果缓存内存检查表明您还没有该记录,则仅发出
    INSERT
    语句

  • 如果您的密钥信息不太大(例如,整键值),并且您没有在内存受限的框上运行,那么这是可能的。否则,缓存的密钥可能无法放入内存中。如果是这种情况

    则不完全可以对插入进行优化:如果要插入表中的任何索引,这些索引将积极妨碍插入,但用于强制执行唯一约束的索引除外,每个插入都需要这些索引来确定是否发生了冲突。任何外键也需要检查,因此,如果它们没有索引,每次都会在后台进行慢速扫描。“如果99.9%的行相同,它肯定应该略过?”只有当插入行的成本明显高于测试重复行的成本时,这才是真的。测试现有行实际上与说
    SELECT 1 WHERE some_key=:new_value
    相同,其中
    some_key
    是一个带有主键或唯一约束的列,这可能意味着一个索引。请注意,虽然我知道一些原则,但我不使用MySQL,因此不知道足够的细节来发布我自己的答案。您使用的存储引擎(MyISAM/InnoDB/etc)也可能会有所不同,因此值得编辑这个问题来提及这一点。您可以查看XML文件是如何构建的,看看是否可以提供无重复的XML文件。如果不是的话,那么你可能正在做的事情可能和其他任何事情一样好,可以把重复的东西扔掉。也就是说,如果您想在问题中编辑表索引,这可能会有所帮助。