Php 优化MySQL的XML解析性能
我正在做一个项目来减少页面的加载时间。运行的PHP脚本建立到数据库的连接。然后它接收一个XML文件,并将每个元素存储在一个变量中。然后运行一个查询来检查“成员ID”是否存在,如果不存在,则在一个很长的INSERT语句(20列)中插入XML中的所有数据。该过程对同一数据库上的不同表重复第二次,如果已经存在,则更新,如果未找到,则插入 什么是加速这些查询或优化它们以使它们运行得更快的最佳方法?我目前正在研究使用索引,但我不确定它们如何工作或如何实现。任何想法都会有帮助 谢谢 下面是一些示例代码:Php 优化MySQL的XML解析性能,php,mysql,xml,performance,indices,Php,Mysql,Xml,Performance,Indices,我正在做一个项目来减少页面的加载时间。运行的PHP脚本建立到数据库的连接。然后它接收一个XML文件,并将每个元素存储在一个变量中。然后运行一个查询来检查“成员ID”是否存在,如果不存在,则在一个很长的INSERT语句(20列)中插入XML中的所有数据。该过程对同一数据库上的不同表重复第二次,如果已经存在,则更新,如果未找到,则插入 什么是加速这些查询或优化它们以使它们运行得更快的最佳方法?我目前正在研究使用索引,但我不确定它们如何工作或如何实现。任何想法都会有帮助 谢谢 下面是一些示例代码: $
$partner_insert = "INSERT INTO `keystore`.`partners` SET ";
$partner_insert .= "`ma_id`='1', `partner_name`='".$member_name."', `partner_email`='".$member_name."', ";
$partner_insert .= "`member_id`='".$member_id."', ";
$partner_insert .= "`member_billingname`='".$member_billingname."', `member_billingconfirstname`='".$member_billingconfirstname."', ";
$partner_insert .= "`member_billingconlastname`='".$member_billingconlastname."', `member_billingcurrency`='".$member_billingcurrency."', ";
$partner_insert .= "`member_billingaddress`='".$member_billingaddress."', `member_billingcity`='".$member_billingcity."', ";
$partner_insert .= "`member_billingcountry`='".$member_billingcountry."', `member_billingzipcode`='".$member_billingzipcode."', ";
$partner_insert .= "`member_billingstate`='".$member_billingstate."', `member_billingstatecode`='".$member_billingstatecode."', ";
$partner_insert .= "`member_billingprimaryemail`='".$member_billingprimaryemail."', `member_billingprimaryphone`='".$member_billingprimaryphone."', ";
$partner_insert .= "`member_billingsecondaryphone`='".$member_billingsecondaryphone."', `last_action_by`='".$ndp_id."', ";
$partner_insert .= "`last_action_date`=NOW(), `last_action`='Create'"
多个插入将很慢。听起来好像你可以批量插入,一次完成数百个。如果执行此操作,则可以使用ON replice KEY UPDATE语法根据行是否存在执行插入或更新 对实际数据进行大量猜测(例如,决定是否要更新而不是插入重复数据的关键是什么),如下所示:-
<?php
$insert_array = array();
foreach($members as $member)
{
if (count($insert_array) > 250)
{
$db->query("INSERT INTO keystone.partners (member_name, member_id, member_billingname, member_billingconfirstname, member_billingconlastname, member_billingcurrency, member_billingaddress, member_billingcity, member_billingcountry, member_billingzipcode, member_billingstate, member_billingstatecode, member_billingprimaryemail, member_billingprimaryphone, member_billingsecondaryphone, ndp_id)".
implode(",", $insert_array).
"ON DUPLICATE KEY UPDATE member_name=VALUES(member_name), member_billingname=VALUES(member_billingname), member_billingconfirstname=VALUES(member_billingconfirstname), member_billingconlastname=VALUES(member_billingconlastname), member_billingcurrency=VALUES(member_billingcurrency), member_billingaddress=VALUES(member_billingaddress), member_billingcity=VALUES(member_billingcity), member_billingcountry=VALUES(member_billingcountry), member_billingzipcode=VALUES(member_billingzipcode), member_billingstate=VALUES(member_billingstate), member_billingstatecode=VALUES(member_billingstatecode), member_billingprimaryemail=VALUES(member_billingprimaryemail), member_billingprimaryphone=VALUES(member_billingprimaryphone), member_billingsecondaryphone=VALUES(member_billingsecondaryphone), ndp_id=VALUES(ndp_id)");
$insert_array = array();
}
$member_name = $db->real_escape_string($member['member_name']);
$member_id = (int)$member['member_id'];
$member_billingname = $db->real_escape_string($member['member_billingname']);
$member_billingconfirstname = $db->real_escape_string($member['member_billingconfirstname']);
$member_billingconlastname = $db->real_escape_string($member['member_billingconlastname']);
$member_billingcurrency = $db->real_escape_string($member['member_billingcurrency']);
$member_billingaddress = $db->real_escape_string($member['member_billingaddress']);
$member_billingcity = $db->real_escape_string($member['member_billingcity']);
$member_billingcountry = $db->real_escape_string($member['member_billingcountry']);
$member_billingzipcode = $db->real_escape_string($member['member_billingzipcode']);
$member_billingstate = $db->real_escape_string($member['member_billingstate']);
$member_billingstatecode = $db->real_escape_string($member['member_billingstatecode']);
$member_billingprimaryemail = $db->real_escape_string($member['member_billingprimaryemail']);
$member_billingprimaryphone = $db->real_escape_string($member['member_billingprimaryphone']);
$member_billingsecondaryphone = $db->real_escape_string($member['member_billingsecondaryphone']);
$ndp_id = (int)$member['ndp_id'];
$insert_array[] = "('$member_name', $member_id','$member_billingname','$member_billingconfirstname','$member_billingconlastname','$member_billingcurrency','$member_billingaddress','$member_billingcity','$member_billingcountry','$member_billingzipcode','$member_billingstate','$member_billingstatecode','$member_billingprimaryemail','$member_billingprimaryphone','$member_billingsecondaryphone',$ndp_id)";
}
$db->query("INSERT INTO keystone.partners (member_name, member_id, member_billingname, member_billingconfirstname, member_billingconlastname, member_billingcurrency, member_billingaddress, member_billingcity, member_billingcountry, member_billingzipcode, member_billingstate, member_billingstatecode, member_billingprimaryemail, member_billingprimaryphone, member_billingsecondaryphone, ndp_id)".
implode(",", $insert_array).
"ON DUPLICATE KEY UPDATE member_name=VALUES(member_name), member_billingname=VALUES(member_billingname), member_billingconfirstname=VALUES(member_billingconfirstname), member_billingconlastname=VALUES(member_billingconlastname), member_billingcurrency=VALUES(member_billingcurrency), member_billingaddress=VALUES(member_billingaddress), member_billingcity=VALUES(member_billingcity), member_billingcountry=VALUES(member_billingcountry), member_billingzipcode=VALUES(member_billingzipcode), member_billingstate=VALUES(member_billingstate), member_billingstatecode=VALUES(member_billingstatecode), member_billingprimaryemail=VALUES(member_billingprimaryemail), member_billingprimaryphone=VALUES(member_billingprimaryphone), member_billingsecondaryphone=VALUES(member_billingsecondaryphone), ndp_id=VALUES(ndp_id)");
?>
在这里提供一些示例代码。@AkshayPaghdar更新了帖子。表中的数据有多大?您是否尝试分析脚本以了解代码的哪些部分需要更多时间?!我猜应该是xml解析。另外,您使用的列类型是什么?!你能发布表格模式吗?如果您的写入速率很高,那么将索引应用于表实际上会降低速度@MosabAhmad如何分析脚本?这将是一系列关于PHP调试和分析的优秀文章: