我正在开发一个项目来减少页面的加载时间。运行的 PHP 脚本会建立与数据库的连接。然后它接收一个 XML 文件,并将每个元素存储在一个变量中。然后运行查询来检查“成员 ID”是否存在,如果不存在,则将 XML 中的所有数据插入很长的 INSERT 语句(20 列)中。对于同一数据库上的不同表,该过程会重复第二次,如果已存在则更新,如果未找到则插入。
加速这些查询或调整它们以使它们运行得更快的最佳方法是什么?我目前正在研究使用索引,但我不确定它们如何工作或如何实现它们。任何想法都会有帮助。
谢谢
这是一些示例代码:
$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 DUPLICATE KEY UPDATE 语法根据行是否存在来执行 INSERT 或 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)");
?>
关于php - 优化 MySQL XML 解析性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23996509/