php - 优化 MySQL XML 解析性能

标签 php mysql xml performance indices

我正在开发一个项目来减少页面的加载时间。运行的 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/

相关文章:

php - 正则表达式在扩展 PCRE (php) 后匹配一个空格

php - 如果字段留空,则无法执行 PHP SQL 查询

php - 如何在 PHP 上对 SimpleXMLElement 进行排序

javascript - 如何获取xml中所有的一级嵌套 Node ?

mysql - 从两个表中选择位置

xml - XSLT 1.0 - 分组 xml 元素

php - 使用空间多边形(边界)查找点

php - 在mysql数据库表单元格中插入链接

php - php 形式的意外错误消息(SQL 语法错误)

mysql - 将子查询中的列添加到主查询的 SELECT 中,而不应用主查询中 WHERE 的过滤器