Php mysqli批量查询建议

Php mysqli批量查询建议,php,mysql,batch-processing,Php,Mysql,Batch Processing,我的用例: 我有多个脚本以每秒几次插入的顺序插入到一个表中。我看到性能下降,所以我认为“批处理查询”和大约每分钟插入几百行会带来性能好处 问题: 我将如何使用mysqli来实现这一点?我当前的代码使用包装器(),如下所示: $array = array();\\BIG ARRAY OF VALUES (more than 100k rows worth) foreach($array AS $key => $value){ $db -> q('INSERT INTO `playe

我的用例:

我有多个脚本以每秒几次插入的顺序插入到一个表中。我看到性能下降,所以我认为“批处理查询”和大约每分钟插入几百行会带来性能好处

问题:

我将如何使用mysqli来实现这一点?我当前的代码使用包装器(),如下所示:

$array = array();\\BIG ARRAY OF VALUES (more than 100k rows worth)
foreach($array AS $key => $value){
  $db -> q('INSERT INTO `player_items_attributes` (`column1`, `column2`, `column3`) VALUES (?, ?, ?)', 'iii', $value['test1'], $value['test2'], $value['test3']);
}
注意事项:

我考虑过使用事务,但听起来这些事务仍然会影响服务器,而不是排队。我更喜欢使用包装器(可以随意推荐一个与我当前的包装器功能类似的包装器),但如果不可能,我会尝试在我使用的包装器中构建建议

来源:

包装纸是从哪里来的

编辑:
我正在尝试优化表速度,而不是脚本速度。此表有超过3500万行,并且有一些索引。

MySQL
INSERT
语法允许一个
INSERT
查询插入多行,如下所示:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
其中,每组括号内的值表示表中的另一行。因此,通过使用数组,可以在一个查询中创建多行

有一个主要限制:查询的总大小不能超过配置的限制。对于10万行,您可能需要将其分解为250行的块,将您的10万行查询减少到400行。你也许可以走得更远

我不打算尝试编写此代码-您必须编写一些代码并在您的环境中进行尝试

下面是一个伪代码版本:

escape entire array // array_walk(), real_escape_string()

block_size = 250; // number of rows to insert per query
current_block = 0;
rows_array = [];


while (next-element <= number of rows) {

    create parenthesised set and push to rows_array  // implode()

    if (current_block == block_size) {
        implode rows_array and append to query 
        execute query
        set current_block = 0
        reset rows_array
        reset query
    }
    current_block++
    next_element++
}

if (there are any records left over) {
    implode rows_array and append to query 
    execute the query for the last block
}
转义整个数组//数组_walk(),real_escape_string()
块大小=250;//每个查询要插入的行数
当前_块=0;
行数组=[];

虽然(下一个元素写一个csv文件并使用如果你只是想让PHP脚本运行得更快,你可以使用
延迟插入
。@Dagon,这是真的,但并没有真正利用mysqli带来任何好处…更不用说它涉及到写入磁盘两次…当RAM不是一个真正的问题时。这肯定会是一个改进,尽管与我现在的相比@DevZer0还有一个很好的建议,但是延迟插入会带来它们自己的问题,而且排队等待成千上万的语句听起来并不是最优的(特别是因为积压可能会增长得很快)也许我应该注意到,我正在尝试优化表速度,而不是脚本执行时间。表在每次插入时都会被锁定,虽然在低于100k行时没有明显的延迟,但表现在已经大大超过3000万行,只有几个索引。感谢您的响应。您概述的原因正是我想要接近的原因这样的问题是,我的问题是mysqli似乎不“很好”支持执行多个准备好的查询。一个伪代码答案会很好,并留给我一些思考的东西。然后不要使用准备好的查询。准备好的查询并不是这里的一些人所说的银弹。你自己总是可以逃避数据。如果你在10万个准备好的查询和400个准备好的查询之间取得平衡,你就可以你自己逃脱了,那么我认为这个论点是相当清楚的。你提出的论点显然是令人信服的,我担心我已经陷入了一个谬论,即它们是“一切都是,一切都是结束的”。我当时处于(现在已经证明的)错误的假设是有支持的方法来实现这一点。令人恼火的是,没有内置对这一点的支持。我会这样做:。如果明天没有其他人提供更好的mysqli解决方案,我会接受你的答案。