首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行许多UPDATE语句最有效的方法是什么?

问运行许多UPDATE语句最有效的方法是什么?
EN

Drupal用户
提问于 2011-11-06 19:41:32
回答 1查看 875关注 0票数 1

高效运行许多UPDATE语句的最有效的方法和最佳实践方法是什么?目前,我只是创建一个文本块,其中包含许多用分号分隔的UPDATE语句,并将其传递到单个db_query()调用中。

使用这种方法,我目前得到了这个错误,所以我猜这不是一种明智的方法:

PDOException: SQLSTATEHY000:一般错误:2014年在其他未缓冲查询处于活动状态时无法执行查询。考虑使用PDOStatement::fetchAll()。或者,如果您的代码只对mysql运行,则可以通过设置PDO::MYSQL_ATTR_USE_BUFFERED_QUERY属性启用查询缓冲。

有更好的方法吗?我需要运行数百条更新语句。

我为什么要问这么多问题呢?对于每个节点,我跟踪该节点的三个指标。这些指标是以编程方式从其他来源确定的(如流量数据)。为了加快速度,我创建了一个表,它只跟踪nid和三个指标的值。定期地,我必须更新这个表中每个节点的指标。系统中的每个节点都将在此表中有一行。

我从这三个值中确定第四个度量,所以每天我必须:

  • 更新指标1-3的值
  • 基于度量1-3的值更新度量4
EN

回答 1

Drupal用户

回答已采纳

发布于 2011-11-06 21:35:41

UPDATE语句会改变数据,因此从定义上来说并不快。如果数据集较小,它们可能相对较快,但表越大,更新就会变得越慢,尤其是涉及更新索引和其他内容的时候。

因此,我怀疑如果您单独或在一个调用中执行它们,这会有多大关系。相反,我将研究以更一般的方式“优化”它们的方法:

  • 也许您可以重写它,以便执行更少的查询,例如使用子查询来获得值。确保实际剖析它,以确保它是更快。一个复杂的查询也可能比许多简单的查询慢。
  • 使用db_transaction()在单个事务中执行所有查询。这不仅将强制一致性(如果您在500中有一个错误,全部或无)。查询其他更改也将被恢复),它在许多系统上也会更快,因为(在默认配置中) MYSQL在每个事务之后强制对文件系统进行写入(如果您不显式地使用事务,则每个更新/插入/删除查询都被视为一个单独的事务)。
  • 也许您的表结构可以优化,以便减少查询。
  • 如果没有办法执行数百个更新查询,我会选择可靠的,而不是性能/快速。例如,看看节点访问表重构是如何完成的(如果有多个节点,就会产生数十万个插入)。当有必要时(例如,安装了一个节点访问模块),它通常只设置一个标志来通知管理员,然后用批处理在后端执行实际的重新构建。

如果你能提供更多关于你真正想要做的事情的细节,我也许也能给你一些实际的建议。

编辑:

更多的暗示,现在你发布了你正在做的事情。

  • 如果您不需要保留旧数据,您可以尝试一下,如果您可以首先计算多个节点的指标,然后删除它们,然后执行多片插入。也许那样更快,也许不是。
  • 通常,我会在hook_cron()中实现您正在做的事情。您可以在每次运行中处理N个节点,存储最高的节点id,在下一次运行时处理next N。如果查询返回的小于请求的N,则到达数据集的末尾并完成当天的操作,将标志设置为今天,并在第二天开始为零。如果您需要同时处理所有节点,我会创建一个简单的drush脚本,您可以从system开始,但仍然将处理分组为节点,以避免内存问题。
  • 如果您在自己的服务器上并且可以安装一些东西,您可以使用不同的后端来存储度量标准。例如,有http://oss.oetiker.ch/rrdtool/,它专门为存储“时间序列数据”(引用自网站)而构建。不过,我从来没有用过。如果你想做大的话,就会有像Hadoop这样的系统,它是Facebook用来处理大量日常度量的系统之一。
票数 4
EN
页面原文内容由Drupal提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://drupal.stackexchange.com/questions/14891

复制
相关文章

相似问题

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