首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是最佳实践?-调用MySQL存储函数的PHP循环影响服务器性能。

问什么是最佳实践?-调用MySQL存储函数的PHP循环影响服务器性能。
EN

Stack Overflow用户
提问于 2013-11-13 21:00:27
回答 1查看 959关注 0票数 2

我有一个PHP脚本,它循环遍历数组,每次传递都调用一个MySQL存储函数。

这严重影响了服务器性能。我觉得我的设计很糟糕。这就是它的工作方式(伪代码)。

  1. 从PHP中的某个源获取数据
  2. 数组中的每一项
    1. 调用在表中插入/更新数据的MySQL存储函数
    2. 移到下一项

​

  1. 端环

MySQL存储函数

  1. 搜索描述性字符串(索引)
  2. 如果存在,则将与其关联的任何ID分配给局部变量,否则插入一个新ID并将新ID分配给局部变量。
  3. 对另一个字符串ID对执行类似的步骤
  4. 插入/更新传递给它的大部分数据

试图解决它,

  • 最初,我有3个单独的存储函数,然后合并成一个。但它并没有解决这个问题。
  • 我还确保搜索的字段有索引。
  • 我得出的结论是,它很可能在每次调用中循环并调用存储的函数。它可能会分配一个进程/线程,该进程/线程在每次后续迭代时都不会被释放或缓慢释放。
  • 我读过关于游标的文章,我知道它们不是很好的实践,特别是对于批量操作,而且几乎总是有一种替代的、更高效的非过程(基于集合的)替代方法。还是我该试试那条路?
  • 我还没有尝试在循环中构建整个查询文本,然后将其作为一个大型SQL批处理运行。尽管我担心超时问题或更难跟踪插入/更新错误。

请分享你的建议和经验。伪代码或代码片段也将不胜感激,提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2013-11-13 21:21:01

减少查询次数总是很好的。在其最基本的形式中,可以一次插入多个行。

代码语言:javascript
复制
// BAD:
while($something) {
    mysql_query("insert into `table` (`fields`) values ('value')");
}
// GOOD:
$rows = [];
while($something) {
    $rows[] = "('value')";
}
if( $rows) mysql_query("insert into `table` (`fields`) values ".implode(",",$rows));

更新会变得更棘手,但它仍然有效:

代码语言:javascript
复制
// BAD:
while($something) {
    mysql_query("update `table` set `field`='value' where `id`=".$i);
}
// GOOD:
$rows = [];
while($something) {
    $rows[] = "(".$i.",'value')";
}
if( $rows) mysql_query("insert into `table` (`id`,`fields`) values
          ".implode(",",$rows)." on duplicate key update `fields`=values(`fields`)");
                              // ^ this is where the magic happens.

看看您是否可以将这种结构应用于您的查询,您应该看到加载时间大大缩短,以获得更快的体验!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19964219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档