为什么要从一组节点加载30秒加上的字段值? -- 7 领域 和 entities 领域 drupal 相关 的问题

Why is loading a field value from a group of nodes taking 30 seconds plus?


3
vote

问题

中文

我有一个带有大约300,000个节点的D7网站。我传递这个函数是300-500个nids的数组。有时函数在一秒钟内运行。有时需要40秒或更长时间!我无法弄清楚导致慢速运行的原因。如何获得Query和Fast的查询?

  function _load_field_values_for_nids($field_name, $nids) {   $field_info = field_info_field($field_name);   $field_id = $field_info['id'];    $map = array();   $nodes_without_required_field = [];    // Load up the properties from the node table.   $sql = 'SELECT * FROM {node} WHERE nid IN (:nids)';   $nodes = db_query($sql, array(':nids' => $nids))->fetchAllAssoc('nid');    // Attach the single field to all nodes.   field_attach_load('node', $nodes, FIELD_LOAD_CURRENT, array('field_id' => $field_id));    foreach ($nodes as $nid => $node) {      if (isset($node->{$field_name}['und'])) {       $map[$node->nid] = $node->{$field_name}['und'][0]['value'];     } else {       $nodes_without_required_field[] = $node->nid;     }   }    $absent_count = count($nodes_without_required_field);   if ($absent_count > 0) {     watchdog("vwyw_load_fields", $absent_count." nodes did not have field, "".$field_name."" ");   }    return $map; }   

我注意到主/ admin / content页面上的六秒查询(拍摄12秒待加载):

六秒查询计算可用内容

此处是关于该计数查询的扩展XHProf输出:

输入图像描述

我认为这可能是一个MySQL配置问题,而是查询的详细信息。例如,我认为这个查询应该很快运行,但需要一秒半:

在此处输入图像说明

下次(相同的页面加载)拍摄了120毫秒,又一次,4.8sec!

更新

这是沿持续时间排序的xhprof输出,以便呼叫函数的简单管理页面:

在此处输入图像描述

英文原文

I have a D7 site with around 300,000 nodes. I am passing this function an array of 300-500 nids. Sometimes the function runs in under a second. Sometimes it takes 40 seconds or more! I can't figure out what causes the slow runs. How can I get the query consistent and fast?

function _load_field_values_for_nids($field_name, $nids) {   $field_info = field_info_field($field_name);   $field_id = $field_info['id'];    $map = array();   $nodes_without_required_field = [];    // Load up the properties from the node table.   $sql = 'SELECT * FROM {node} WHERE nid IN (:nids)';   $nodes = db_query($sql, array(':nids' => $nids))->fetchAllAssoc('nid');    // Attach the single field to all nodes.   field_attach_load('node', $nodes, FIELD_LOAD_CURRENT, array('field_id' => $field_id));    foreach ($nodes as $nid => $node) {      if (isset($node->{$field_name}['und'])) {       $map[$node->nid] = $node->{$field_name}['und'][0]['value'];     } else {       $nodes_without_required_field[] = $node->nid;     }   }    $absent_count = count($nodes_without_required_field);   if ($absent_count > 0) {     watchdog("vwyw_load_fields", $absent_count." nodes did not have field, \"".$field_name."\" ");   }    return $map; } 

I noticed this SIX-SECOND query on the main /admin/content page (which took 12+seconds to load):

Six Second Query to Count Available Content

Here is the expanded XHProf output regarding that Count query:

enter image description here

I think this might be a mysql configuration issue rather that the particulars of a query. For instance, I think this query should run very quickly but it takes a second and a half:

enter image description here

The next time (same page load) it took 120ms and the time after that, 4.8sec!

UPDATE

Here is the XHProf output sorted by duration for a simple admin page that calls the function:

enter image description here

     

回答列表

4
 
vote

我猜测快速运行和慢速运行之间的区别是缓存。 field_attach_load中是对cache_get_multiple()的调用。字段值可以从缓存中加载,这应该更快地提高: https://api.drupal.org/api/drupal/modules!菲尔德!

进一步调查我建议使用Devel模块的查询记录器。它可以显示查询中花费的时间。如果这是不够的,您可以使用像XHPROF或Blackfire这样的分析器来查看哪个函数调用最多的时间。

 

I'm guessing that the difference between the fast runs and the slow runs is caching. Within field_attach_load is a call to cache_get_multiple(). The field values can load from a cache which should be a lot faster: https://api.drupal.org/api/drupal/modules!field!field.attach.inc/function/field_attach_load/7

To investigate further I recommend using devel module's query logger. It can show the amount of time spent within queries. If that is not sufficient you can use a profiler like XHProf or Blackfire to see exactly which function calls are taking the most time.

 
 
     
     

相关问题

0  每用户获得修订次数?  ( Get number of revisions per user ) 
我正在尝试展示用户编辑一个节点的次数,如下所示,因此我已经启用了对我的内容类型的修订。 user1(300) user2(288) user3(200) 问题是,当有人创建一个新节点时,它会在node_revision表中保存为修订,但我不想将其计算为编辑。 如何实现这一目标? 这是我正在使用的代码,到目前...

1  添加图像上传到主题配置  ( Add image upload to theme configuration ) 
我正在尝试将图像上传到我所做的主题中的主题设置。显示图像上传字段确实出现,但实际上没有上传,并且图像永远不会得到保存。 在主题 - settings.php中我有函数 function mytheme_form_system_theme_settings_alter(&$form, $form_state, $...

0  转换为指定的语言[已关闭]  ( Translate to specified language ) 
关闭。这个问题需要更多聚焦。它目前不接受答案。 想要改进这个问题?更新问题,因此它仅拍摄了一个问题,只有编辑此帖。 关闭 1年前。 ...

2  如何从节点中删除一些注释?  ( How to remove some comments from a node ) 
我在数据库中创建了一个新表,以将评论与他们提交的节点版本相关联。现在,当节点渲染时,我只想显示与特定节点VID关联的注释。我考虑在hook_node_view中查询db以删除不适用的注释,但理想情况下,只有与vid关联的注释首先将添加到节点。有没有更好的方法来实现这个?我可以在评论添加到它之前是否在节点上? ...

4  如何基于身体中的字符数显示视图块?  ( How to display a view block based on number of characters in body ) 
我目前有一个视图,它会创建"关于作者" 框,从用户的配置文件中提取信息,并根据节点(内容)的作者显示相应的作者框。我只想在节点中具有最小字符量的节点上显示它。 (它目前显示所有节点,块已启用。) 所需的结果是长块内容有一个"关于作者" 框,而短件的内容没有。 我所拥有的问题是,当我选择视图的过滤条件时,未列出节点的主...

1  某些阻止代码正确处理匿名用户  ( Certain block code processes correctly for anonymous user ) 
我在Drupal 7.41网站上安装了Bluemasters主题。在此主题中,我创建了几个新区域并将新块添加到这些区域,所有这些区域都在任何访问者可用的主页上。 我发现当我将其视为经过身份验证的用户时,主页与匿名用户一起看。作为匿名用户,我有4个独立的文本块,彼此顶部,但是当我登录此文本都是正确的地方。 我发现如果我...

0  克隆网站指向原始网站的数据库 - 这可能会出现问题吗?  ( Cloned site pointing to original sites database can this cause problems ) 
可以指向原始网站的数据库的克隆站点导致问题? 我正在使用坐在单独的服务器上的MySQL数据库运行Drupal 7站点。 我将站点的代码库存储库的克隆挂在一个单独的开发服务器上,然后将数据库的最近备份导入了一个新的数据库。该站点从不同的域中正常运行。 但是,我忘了更新 local.settings.php 文件...

0  仅为其他页面启用高速缓存的前页提升?  ( Boost only for front page with cache enabled for other pages ) 
我知道 boost 模块只在禁用耳机缓存时才工作。 但是有没有办法打开 boost 模块仅限前页,启用缓存对于其他页面。 ...

-1  找到所有节点中重复了多少次关键字  ( Find how many times keyword is repeated in all nodes ) 
我有商业列表的节点,具有业务的标题,正文和其他联系人字段。 我想对所有内容"10000节点" 进行研究,并在每个节点的标题和身体字段中找到最重复的单词,因此我可以使用找到的关键字标记内容。 任何想法? ...

1  如何检查实体已创建?  ( How to check entity is already created ) 
我有创建名为"胜利" 的代码以实体类型为单位,我的问题是如何防止用户再次以相同的名称创建实体。 function commerce_services_store_create($data, $flatten_fields) { $storeName = $data['store_name']; $stat...

0  WebServices创建(注册)新用户  ( Webservices to create register a new user ) 
我计划编写连接到Drupal 7的客户端应用程序。我喜欢通过应用程序创建新用户,遇到一些文献,但我不确定该方法是否安全,也是它是否认为所有可能的使用 - 案例。 我遇到的第一个链接是这样的: https://www.drupal.org/node/1514312 我能够配置端点并成功发布+创建用户。但是,上述方...

4  如何为特定的Drupal页面添加jQuery较低版本?  ( How to add jquery lower version for a particular drupal page ) 
我已安装jQuery更新模块并将jQuery 1.10设置为默认jQuery版本,但我以前的功能停止工作之一。 我只想为特定页面使用jQuery 1.8。我如何实现这一目标? ...

1  如何获取实体参考字段的产品图像字段URL  ( How to get url of product image field of entity reference field ) 
尝试使用产品页面上的相关产品创建视图(块)。产品有一个字段"相关产品" (实体参考)以及在我的视图中(显示产品"字段)我可以使用上下文过滤器(内容:nid)和关系来获取它们的图像和标题(实体参考:相关产品)。但是,标题和图像URL存在问题,它们导致编辑页面(如管理员/商业/产品/ 1),但不限于内容。 我试图添加一个...

1  HTML标签未通过打印模块和HTML邮件[关闭]  ( Html tags not filtered with print module and html mail ) 
关闭。这个问题需要详细信息或清晰度。它目前不接受答案。 想要改进这个问题?添加详细信息并通过编辑此帖的问题。 关闭 4年前。 ...

2  过滤器包含完整的单词吗?  ( Is filter contains all words working well ) 
我有一个视图和过滤器,"包含所有单词" 。我看到SQL包含表达式 '%word1%' AND '%word2%', 但是,如果我写"角度" ,就在我开始写作"A" 时,也有字符A且不一定从A开始的单词出现,例如"物质" 。 不应该占位符%只在一个地方,以这种方式: LIKE ( 'word1%' AN...

1  Drupal无法为位于主题目录中的文件创建图像样式  ( Drupal cant create image styles for files located in theme directory ) 
我有一个位于站点/全部/主题/ mytheme / images目录的图像。 我正在以编程方式向图表方式显示如下: $style = array( 'style_name' => 'my_style', 'path' => drupal_get_path('theme', 'mytheme'...

0  如果主题给出白色屏幕,我如何选择默认主题?  ( How do i choose a default theme if the theme gives a white screen ) 
我试图为所有TPL文件制作一个文件夹模板,但是在现在我不能在XAMP上再加载我的主题?现在,当我尝试在drupal加载主题时,只有白色屏幕。我可以做什么? 我厌倦了,所以如果你在drupal犯了一个错误,你需要一次又一次地安装。 我选择一个不同的主题,我关闭浏览器,但主题不起作用。如果我不再进入Drupal?,我如何...

2  插入PostgreSQL的查询  ( Insert query for postgresql ) 
在Drupal 7中用开发的自定义模块插入PostgreSQL数据库中,我使用以下查询: $query = Database::getConnection('default', 'move') ->query("INSERT INTO clients (client_ref,client_lastname,c...

2  论坛如何确定每个用户的新答复?  ( How does forum determine new replies for each user ) 
当我访问 998876661 时,在 Replies 列中,我可以看到添加了多少新帖子。 Drupal还将它们标记为 New 标记。 我想知道Drupal如何确定哪些回复是我的新答复?自上次访问页面以来是新的,还是我的最后一个注销drupal.org?如果稍后是正确的,Drupal如何知道最后一次退出时如何知道? ...

0  更改块渲染阵列并添加另一个块的内容  ( Alter block render array and add another blocks content ) 
我试图通过 hook_block_view_alter 。源块是MENU_BLOCK,要附加的块是视图块,但块的类型对于解决方案不应该重要。 以下是用于附加块的代码。假设 block_attached_block 用块的出价填充,在我更改渲染阵列时,我有一个完全呈现的块。 function MODULE_bloc...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.