通用索引问题的永久解决方案


23

我们开发了一些具有大量库存记录的magento项目,并且始终会遇到索引问题,我们一直在尝试尝试在互联网上找到的所有解决方案,以解决日常索引问题,例如截断平面图并使用CLI重新编制索引,将cron设置为索引编制,但这是我们面对索引编制问题的日常头痛。

当我们在项目上工作时,我们正在寻找永久性的解决方案,这些项目有不同的场景,例如每天更新产品或每天从其他饲料中导入产品。

对此有一些最佳做法或解决方法的任何人,请与他们分享,将不胜感激。


我在Magento及其扩展以及极其低效和愚蠢的数据体系结构上浪费了一年,这使一个仅包含1万多种产品的电子商务网站就被淘汰了。所有开始看到Magento CE的人都应该得到所有这些警告。Magento的供应商应该因为浪费数千个工时而上法庭。只是让数据库做索引,而不做数据库的工作。我建议,与其将金钱浪费在专用服务器上,然后浪费大量的整夜不眠之夜,不如将其转移到使用MS SQL服务器的托管电子商务平台或开放源代码上。
semiprecious.com,2013年

您是否曾经以为您找不到正确的扩展名或正确的服务器配置?如果某些软件不符合您的需求,并不一定意味着它没有用。在过去5年多的时间里,我一直从Magento那里赚取面包(和啤酒),而且我也有很多满意的客户。一些目录超过10k。
马吕斯

由于CE工作数据维护的方式是10s至100s成千上万的问题,因此它们是正确的。由于EE已进行索引更新,因此EE更好,但这是针对收入数亿美元的公司的。您可以为此托管,但是您的投资回报率将变为负数。我们使用的解决方案非常专业,与SAP和Walmart这样的解决方案类似的增量流程上传,结合了特殊的定价解决方案(ATG风格),可以绕开索引问题(汇率和内边际利润/属性重新计算),并与集群结合托管。简单的答案不,Magento的设计不是最佳的。

Answers:


31

重要的是要了解哪些索引比较慢以及为什么

目录的复杂性以及最终的商店架构将决定重新索引需要多长时间-并与基础架构结合在一起。

  • 如果您有50,000种产品和10个商店视图,则可以保证处理几百万行catalog_url_rewrite需要时间。

  • 如果你有100个产品,但5000点的属性,可以保证catalog_attributescatalog_product_flat表将采取年龄重建,或落在在其正面

  • 如果您有1,000种产品,但有500种可搜索的属性,catalog_fulltext_search则将需要一段时间才能完成

解决您面临的每一个问题的方法都不是一刀切,这与正确构建商店有关;拥有合适的基础架构来支持它,并使用重新索引的频率/策略来支持内容的新近度和性能。

  • 添加前端缓存根本无济于事
  • 在这种情况下扔更多的硬件可能
  • 解决目录的大小/复杂性将有所帮助
  • 使用第三方索引工具将有所帮助
  • 外部化某些索引(例如,搜索> SOLR)将有所帮助

还需要评估是否甚至需要某些索引。使用固定产品/类别并不总是使所有商店都更快。我们已经看到它使商店的速度变慢了。因此,您可能会在测试前后的性能之后发现它们甚至都不是考虑因素。


8

tl; dr

没有解决方案。我建议有一些解决方法Sonassi_Fastsearchindex-但这是专门用于目录搜索的。

也许在保存时禁用索引更新-安排运行一整夜-会有所缓解吗?结合添加更多的缓存-memcached,Redis,APC-以及像Varnish这样的全页缓存(如果您正在运行CE)可能会帮助您入门。如果您打算使用Varnish,请在Nexcess_Turpentinegithub上查找快速入门。

更多信息

索引问题-特别是catalog_url_rewrites-在社区中是众所周知的并记录在案。Magento在企业版中处理了这些问题,因为这些是受影响最严重的客户。许多EE客户拥有超过1万种产品,并拥有多个商店视图,网站等。

但是,如果您的目录很大且属性很多,则可能会发现索引将花费很长时间(特别是catalog_url_rewrite,product_flat),在这种情况下,我的建议是不修复索引运行时间长度,而是减轻一些处理的负担,使盒子花费CPU周期索引而不是提供内容

要问自己的问题:

  • 我是否由于索引问题而失去业务?
  • 我是否由于索引问题而失去生产力
  • 我是否有失去转化的风险或我的转化率受到了影响?
  • 我的客户是否有因索引不同步(库存等)直接导致缺货的风险?
  • 我的目录定价规则是我的核心业务的一部分吗?
  • 我的现场搜索转换率是否高于正常水平(8-10%),从而受益于更好的索引编制?

对于此特定问题,没有灵丹妙药的解决方案-作为解决方案提供商,您应该帮助您的客户做出最能改善销售和业务,同时保持较低间接成本的决定。

备择方案

将目录搜索卸载并分层导航到Solr。

水平缩放。添加更多Apache / nginx服务器。更多的服务器=更多的并发吞吐量。这不是1:1。Nexcess在此处提供了有关性能和Apache配置的出色白皮书:http : //www.nexcess.net/magento-best-practices-whitepaper

而且,如果您选择使用Varnish,请记住:

在此处输入图片说明


我们很欣赏这些道具,但是重新索引与前端缓存无关。它完全是一个后端操作。减轻前端负载将防止重新索引花费更长的时间,但肯定不会使其更快。
Ben Lessani-Sonassi

我要减少的是减少访问箱的流量。这里最终要考虑的是该站点在索引运行期间变得不可用,或者在作业运行时锁定了未知的时间段。归根结底,如果索引编制对前端没有负面影响,则作业运行多长时间都无关紧要。索引加载时间没有修复或改进。没有人希望得到“升级到付费版本”的答案-因此,我的建议是提高前端的可用性并安排索引在非高峰期运行。
philwinkle

绝对,我理解-但是可用性对于网站很重要;对于电子商务网站而言,这还不够。如果由于索引被锁定而导致您实际上无法购买商品,那么该站点可能也处于脱机状态。
Ben Lessani-Sonassi

我们只有几百种产品,在Magento 1.7上保存一个简单的产品仍需要几分钟,而且我每月要花500美元以上购买专用的Rackspace服务器。我不确定从哪里开始,但我怀疑某些索引可能已损坏。谁能推荐一个好的magento顾问?
Max Hodges

5

在大多数笨重的Magento网络商店中,要使Magento后端索引管理正常工作非常困难。我经常遇到这个问题。开发人员一直在运行shell脚本通常很忙。通常,我确实会像这样永久解决此问题。

我创建一个新的shell / indexer.php> shell / myindexer.php副本

在第154行附近自定义shell / myindexer.php

} else if ($this->getArg('reindex') || $this->getArg('reindexall')) {

} else if ($this->getArg('reindex') || $this->getArg('reindexall')  || $this->getArg('reindexallrequired') ) {

然后在166行附近添加此检查

//reindex only if required
if( $this->getArg('reindexallrequired') && $process->getStatus() == Mage_Index_Model_Process::STATUS_PENDING )
    continue;

之前

$startTime = microtime(true);
$process->reindexEverything();
$resultTime = microtime(true) - $startTime;
Mage::dispatchEvent($process->getIndexerCode() . '_shell_reindex_after');

然后将新的Shell脚本添加到cpanel cron中,以每5分钟运行一次

/home/public_html/shell/indexer.php --reindexallrequired >/dev/null

由于上述shell脚本每5分钟运行一次,并且仅对需要重新索引的进程重新编制索引,因此降低了服务器cpu负担沉重的风险,并且整个重新编制索引的过程非常快。如果没有进程需要重新编制索引,它将根本不运行重新编制索引的过程。另外,请记住在“索引管理”页面中将重新索引编制模式设置为“保存时更新”。如果您不知道,可以在“操作”>“提交”按钮旁边的更改索引模式下获得此选项。


@changeling,不客气。我很高兴你值得。
rbncha

万一有人觉得有用,我已将其合并到脚本中:gist.github.com/steverobbins/…–
史蒂夫·罗宾斯

4

如果您可以提供更多数据(库存量,访客,机器),会更容易说,但是有可能:

  • 我们使用Sonassi_Fastsearchindex扩展作为目录搜索索引。尽管它只是索引标题,描述和sku(我想我已经注意到了),但是它很好用,并减少了catalogsearch索引器的时间。
  • 很有可能您不必运行某些索引器,即用于标签或用于产品属性。如果您只定期进行价格,产品平面,类别产品和目录搜索,而其他每天可能只进行一次,这就足够了。
  • 我们每两个小时与外部系统同步产品一次,与此同时,我们使用php-scripts进行索引。因此,对于要运行到特定时间的每个索引器,我们都有一个cronjob,然后让该cron执行脚本。这似乎是服务器可以执行的操作与最新产品数据之间的最佳中间点。

它在Magento CE 1.7.0.2上运行;不过还是很痛苦;)


我们通常面临产品扁平化的问题,所有其他指标都很好。
ravisoni

3

使用Dnd_Patchindexurl,我能够将catalog_url_rewrite重新索引时间减少到将近70%

我认为这是一个很好的解决方案,可以将禁用的产品或不可见的产品排除在外而创建URL!

$ php ./shell/indexer.php -reindexall
Product Attributes index was rebuilt successfully in 00:00:11
Product Prices index was rebuilt successfully in 00:00:22
Catalog URL Rewrites index was rebuilt successfully in 00:08:49
Product Flat Data index was rebuilt successfully in 00:00:51
Category Products index was rebuilt successfully in 00:00:19
Catalog Search Index index was rebuilt successfully in 00:00:12
Stock Status index was rebuilt successfully in 00:00:00
Tag Aggregation Data index was rebuilt successfully in 00:00:00

后:

$ php ./shell/indexer.php -reindexall
Product Attributes index was rebuilt successfully in 00:00:12
Product Prices index was rebuilt successfully in 00:00:24
Catalog URL Rewrites index was rebuilt successfully in 00:02:52
Product Flat Data index was rebuilt successfully in 00:00:57
Category Products index was rebuilt successfully in 00:00:25
Catalog Search Index index was rebuilt successfully in 00:00:13
Stock Status index was rebuilt successfully in 00:00:00
Tag Aggregation Data index was rebuilt successfully in 00:00:00

我在1.9.1.1上安装了它,并且工作得很好!

也可以通过Connect安装http://www.magentocommerce.com/magento-connect/catalog/product/view/id/15074/s/dn-d-patch-index-url-1364/category/12863/


1

升级到EE 1.13。在此版本中,索引器得到了很大的改进。


2
但是大多数客户更喜欢社区版本。
ravisoni

1
同意 1.8将在几周后发布,但很可能不包括索引器优化。我也不喜欢,但这是使索引器运行的最简单,最安全,甚至最便宜的方法。
Paul Grigoruta

这是不可能找到永久解决方案的。
ravisoni

在大多数情况下,如果某人拥有如此多的SKU,以至于他们实际上已经与现有的CE 1.7索引器碰上了墙,那么他们应该使用EE 1.13。这些CE 1.7和EE 1.12索引器的SKU为10-25k,有很多运行平稳的站点。关键是主要在工作流程级别上正确地管理它们,并拥有正确的基础结构。
davidalger

CE是完全合适的选择。EE 1.13中的功能漏洞修复 -无论如何,社区已将其带入CE。无论如何,无论您使用CE还是EE,索引时间始终完全取决于目录的复杂性,服务器配置,访问者并发性和重新索引频率。EE并非万能的灵丹妙药,当然也不是解决任何与体系结构相关的问题的合适解决方案。
Ben Lessani-Sonassi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.