0

我必须每天从 xml 向 mysql 插入大量数据,我使用 cron 作业完成这项工作,但将所有数据插入我的数据库大约需要 2 个小时,

有没有办法减少那个时间?

这是我的代码:

我使用 meekroDB 插入

我的第一个代码是(这很简单):

for ($i = 0; $i <= count($xml->Table);$i++) {



DB::insert($PreFix."_stock", array(
  'refid' => (string)$xml->Table[$i]->refid,
  'articulo' => (string)$xml->Table[$i]->articulo,
  'modelo' => str_replace($lessCharMeta,$lessCharMeta2,(string)$xml->Table[$i]->modelo),
  'metadatos' => str_replace($lessCharMeta,$lessCharMeta2,(string)$xml->Table[$i]->metadatos),
  'estado' => (string)$xml->Table[$i]->estado,
  'reffab1' => (string)$xml->Table[$i]->reffab1,
  'reffab2' => (string)$xml->Table[$i]->reffab2,
  'refequiv' => (string)$xml->Table[$i]->refequiv,
  'nota' => str_replace($lessCharMeta,$lessCharMeta2,(string)$xml->Table[$i]->nota),
  'precio' => (string)$xml->Table[$i]->precio,
  'numfotos' => (string)$xml->Table[$i]->numfotos,
  'fechamod' => (string)$xml->Table[$i]->fechamod,
  'idarticulo' => (string)$xml->Table[$i]->idarticulo,
  'idversion' => (string)$xml->Table[$i]->idversion

    ));

所以我的问题是:插入86k行的时间很长是正常的还是有什么最好的方法?

在我开始使用 meekroDB 进行测试之前,我编写了这段代码,但我总是超时

for ($i = 0; $i <= count($xml->Table);$i++) {


        $VALUES[] = "( '".
        (string)$xml->Table[$i]->refid."' , '".
        (string)$xml->Table[$i]->articulo."' , '".
        str_replace($lessCharMeta,$lessCharMeta2,(string)$xml->Table[$i]->modelo)."' , '".
        str_replace($lessCharMeta,$lessCharMeta2,(string)$xml->Table[$i]->metadatos)."' , '".
        (string)$xml->Table[$i]->estado."' , '".
        (string)$xml->Table[$i]->reffab1."' , '".
        (string)$xml->Table[$i]->reffab2."' , '".
        (string)$xml->Table[$i]->refequiv."' , '".
        str_replace($lessCharMeta,$lessCharMeta2,(string)$xml->Table[$i]->nota)."' , '".
        (string)$xml->Table[$i]->precio."' , '".
        (string)$xml->Table[$i]->numfotos."' , '".
        (string)$xml->Table[$i]->fechamod."' , '".
        (string)$xml->Table[$i]->idarticulo."' , '".
        (string)$xml->Table[$i]->idversion."' )";

     }


    $stmt = $mysqli->prepare(
    "CREATE TABLE IF NOT EXISTS ".$PreFix."_stock(ID int(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `refid` VARCHAR(10),
    `articulo` VARCHAR(200),
    `modelo` VARCHAR(16),
    `metadatos` VARCHAR(500),
    `estado` VARCHAR(100),
    `reffab1` VARCHAR(50),
    `reffab2` VARCHAR(50),
    `refequiv` VARCHAR(50),
    `nota` VARCHAR(200),
    `precio` VARCHAR(15),
    `numfotos` VARCHAR(2),
    `fechamod` VARCHAR(50),
    `idarticulo` VARCHAR(10),
    `idversion` VARCHAR(10) )"
    );
    $stmt->execute();
    $stmt->close();



$temp = "";

foreach ($VALUES as $KEY){

if (!empty($KEY)){
$temp = $temp."  , ".$KEY;}

}


    $sentencia = "
    INSERT INTO ".$PreFix."_stock
    (refid,articulo,modelo,metadatos,estado,reffab1,reffab2,refequiv,nota,precio,numfotos,fechamod,idarticulo,idversion)
     VALUES 
    ";



    if ($stmt = $mysqli->prepare($sentencia.$temp) ){
       $stmt->execute();
        $stmt->close();
    }
    else {

        printf("Errormessage: %s\n", $mysqli->error."<hr/>");
    }

然后我决定通过发送数据发送for循环索引,每500次插入一次又一次地跳转到同一个脚本,但是当我设置cron作业来完成这项工作时,它永远不会跳过脚本。

使用 meekroDB 有点慢,但我从来没有让 PHP 超时

4

3 回答 3

1

您可以将其作为批处理作业来完成。每次阅读后不要插入。一次插入多行。

你会做什么,是在数组中收集 10 行,然后从这些行构建查询,例如:INSERT INTO 表(字段 1、2、3、4、4 等) VALUES(dataset1)、(dataset2)、(数据集3)... 10

然后你会节省很多时间,因为你做的插入少了 10 倍。您的数据库中可能有很多行......甚至可能有多个索引,这会使插入速度变慢。

于 2014-09-11T19:23:24.897 回答
0

MySQL 也有一个LOAD XML INFILE.
根据提供的 XML,我认为它需要是这样的:

LOAD XML LOCAL INFILE 'data.xml'
INTO TABLE tablename
ROWS IDENTIFIED BY '<Table>'

如果这不起作用,您可以尝试将其转换为 CSV 格式并LOAD DATA INFILE改用。

LOAD DATA LOCAL INFILE 'data.csv' INTO TABLE tablename
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

请记住,要使其LOAD ... LOCAL INFILE正常工作,您需要将您的data.xmlordata.csv文件放在与 MySQL 相同的服务器中,并使用文件的真实路径。

您还可以将文件导入临时表以在将其插入真实表之前进行一些处理:

INSERT INTO tablename (col1, col2, col3)
SELECT tmp.col1, tmp.col2, replace(tmp.col3, 'foo', 'bar')
FROM tmp WHERE tmp.col1 > 0

希望它有效!:)

于 2014-09-11T20:19:10.983 回答
0

Mysql 文档:“从文本文件加载表时,使用 LOAD DATA INFILE。这通常比使用 INSERT 语句快 20 倍”

我想我会将数据从 xml 解析为 csv,然后使用加载数据。

xml 文件的一部分 -->

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Table>
    <referencia>001004024053008</referencia>
    <ubicacion>Montada revisada</ubicacion>
    <refid>3301474</refid>
    <articulo>MOTOR COMPLETO</articulo>
    <modelo>FORD MONDEO TURNIER (GE) Futura X   |   01.06 - 12.07</modelo>
    <metadatos> | MOTOR COMPLETO | FORD MONDEO TURNIER (GE) FUTURA X 2.0 TDCI CAT |   2007 08825 |  | 3301474 |  |  | COLECTOR DE ADMISION DESMONTADO</metadatos>
    <estado>Material revisado</estado>
    <reffab1 />
    <reffab2 />
    <refequiv />
    <nota>COLECTOR DE ADMISION DESMONTADO</nota>
    <precio>900.000</precio>
    <numfotos>0</numfotos>
    <fechamod>2014-08-13T19:38:39.52+02:00</fechamod>
    <idarticulo>9</idarticulo>
    <idversion>2216764</idversion>
  </Table>
  <Table>
    <referencia>006001083046004</referencia>
    <ubicacion>Montada revisada</ubicacion>
    <refid>3300752</refid>
    <articulo>CAJA CAMBIOS</articulo>
    <modelo>VOLKSWAGEN LUPO (6X1/6E1) Advance   |   06.04 - 12.05</modelo>
    <metadatos> | CAJA CAMBIOS | VOLKSWAGEN LUPO (6X1/6E1) ADVANCE 1.4 TDI | AMF  2001 08822 |  | 3300752 |  |  | </metadatos>
    <estado>Material revisado</estado>
    <reffab1 />
    <reffab2 />
    <refequiv />
    <nota />
    <precio>300.000</precio>
    <numfotos>0</numfotos>
    <fechamod>2014-08-13T19:30:43.922+02:00</fechamod>
    <idarticulo>175</idarticulo>
    <idversion>2216763</idversion>
  </Table>
  <Table>
    <referencia>001004083046004</referencia>
    <ubicacion>Montada revisada</ubicacion>
    <refid>3300716</refid>
    <articulo>MOTOR COMPLETO</articulo>
    <modelo>VOLKSWAGEN LUPO (6X1/6E1) Advance   |   06.04 - 12.05</modelo>
    <metadatos> | MOTOR COMPLETO | VOLKSWAGEN LUPO (6X1/6E1) ADVANCE 1.4 TDI | AMF  2001 08822 | AMF | 3300716 |  |  | </metadatos>
    <estado>Material revisado</estado>
    <reffab1>AMF</reffab1>
    <reffab2 />
    <refequiv />
    <nota />
    <precio>1000.000</precio>
    <numfotos>0</numfotos>
    <fechamod>2014-08-13T19:30:46.792+02:00</fechamod>
    <idarticulo>9</idarticulo>
    <idversion>2216763</idversion>
  </Table>
  <Table>
    <referencia>010015023127001</referencia>
    <ubicacion>Almacenada</ubicacion>
    <refid>2851404</refid>
    <articulo>AIRBAG DELANTERO IZQUIERDO</articulo>
    <modelo>FIAT SCUDO ACRISTALADO    |   01.07 - ...</modelo>
    <metadatos> | AIRBAG DELANTERO IZQUIERDO | FIAT SCUDO ACRISTALADO 2.0 JTD | RHK  2007 07282 |  | 2851404 |  |  | [V.A] FIAT SCUDO 2.0 HDI FURGON - ACRISTALADO - CORTO [07282]</metadatos>
    <estado>Material revisado</estado>
    <reffab1 />
    <reffab2 />
    <refequiv />
    <nota>[V.A] FIAT SCUDO 2.0 HDI FURGON - ACRISTALADO - CORTO
[07282]</nota>
    <precio>0.000</precio>
    <numfotos>3</numfotos>
    <fechamod>2013-06-12T21:47:33+02:00</fechamod>
    <idarticulo>54</idarticulo>
    <idversion>2207294</idversion>
  </Table>
  <Table>
    <referencia>010071023113007</referencia>
    <ubicacion>Almacenada</ubicacion>
    <refid>3021150</refid>
    <articulo>AIRBAG CORTINA DELANTERO IZQUIERDO</articulo>
    <modelo>FIAT STILO (192) 1.9 120 Dynamic Multijet   |   09.05 - ...</modelo>
    <metadatos> | AIRBAG CORTINA DELANTERO IZQUIERDO | FIAT STILO (192) 1.9 120 DYNAMIC MULTIJET 1.9 8V JTD CAT |   0 |  | 3021150 |  |  | </metadatos>
    <estado>Material de segunda mano</estado>
    <reffab1 />
    <reffab2 />
    <refequiv />
    <nota />
    <precio>0.000</precio>
    <numfotos>0</numfotos>
    <fechamod>2013-06-12T23:22:17+02:00</fechamod>
    <idarticulo>460</idarticulo>
    <idversion>2208730</idversion>
  </Table>
  <Table>
    <referencia>010080059055011</referencia>
    <ubicacion>Almacenada</ubicacion>
    <refid>3104859</refid>
    <articulo>PRETENSOR AIRBAG IZQUIERDO</articulo>
    <modelo>NISSAN PRIMERA BERLINA (P11) SLX   |   05.96 - 12.99</modelo>
    <metadatos> | PRETENSOR AIRBAG IZQUIERDO | NISSAN PRIMERA BERLINA (P11) SLX 2.0 TURBODIESEL CAT | CD20T  1998 07690 |  | 3104859 |  |  | </metadatos>
    <estado>Material de segunda mano</estado>
    <reffab1 />
    <reffab2 />
    <refequiv />
    <nota />
    <precio>0.000</precio>
    <numfotos>4</numfotos>
    <fechamod>2013-08-12T09:32:57+02:00</fechamod>
    <idarticulo>469</idarticulo>
    <idversion>2210365</idversion>
  </Table>
于 2014-09-11T19:53:09.883 回答