有人可以详细解释Magentos索引功能吗?

时间:2011-02-09 13:12:11

标签: php mysql database magento indexing

我有点了解Magento中的索引是如何工作的,但我还没有看到任何关于此的好文档。我想知道以下内容。

  • 工作原理
  • 目的是什么
  • 为什么重要
  • 每个人都应该了解的具体细节
  • 还可以帮助其他人完全理解索引是什么以及如何在Magento中使用

我认为拥有这些信息对我船上的其他人来说非常有用,而这些信息并没有完全得到索引过程。

更新: 在对我的问题和Ankur的回答发表评论之后,我想我错过了一些关于正常数据库索引的知识。那么这只是Magento处理索引的版本,对我来说更好的是通常在数据库索引方面得到我的答案,例如这里的链接How does database indexing work?

3 个答案:

答案 0 :(得分:32)

Magento的索引与精神上的数据库级索引类似。正如Anton所说,这是一个非规范化的过程,可以让网站更快地运行。让我试着解释Magento数据库结构背后的一些想法,以及为什么它需要索引才能以高速运行。

在更“典型”的MySQL数据库中,用于存储目录产品的表格的结构如下:

PRODUCT:
    product_id INT
    sku        VARCHAR
    name       VARCHAR
    size       VARCHAR
    longdesc   VARCHAR
    shortdesc  VARCHAR
    ... etc ...

这对于检索而言很快,但它为一个电子商务软件留下了根本问题:当您想要添加更多属性时,您会怎么做?如果您销售玩具,而不是尺寸栏,您需要age_range怎么办?好吧,你可以添加另一个列,但应该很清楚,在一个大型商店(例如,想想沃尔玛),这将导致90%为空的行,并且几乎不可能尝试维护新属性。

为了解决这个问题,Magento将表格分成更小的单位。我不想在这个答案中重新创建整个EAV系统,所以请接受这个简化的模型:

PRODUCT:
    product_id INT
    sku        VARCHAR

PRODUCT_ATTRIBUTE_VALUES
    product_id   INT
    attribute_id INT
    value        MISC

PRODUCT_ATTRIBUTES
    attribute_id
    name

现在可以通过在product_attributes中输入新值然后将相邻记录放入product_attribute_values来随意添加属性。这基本上就是Magento所做的事情(对数据类型的尊重比我在这里显示的更多)。事实上,现在没有理由让两个产品具有相同的字段,因此我们可以创建具有不同属性集的整个产品类型

然而,这种灵活性需要付出代价。如果我想在我的系统中找到衬衫的color(一个简单的例子),我需要找到:

  1. 项目的product_id(在产品表中)
  2. attribute_id color(在属性表中)
  3. 最后,实际的value(在attribute_values表中)
  4. Magento曾经像这样工作,但它已经慢了。因此,为了获得更好的性能,他们做出了妥协:一旦店主定义了他们想要的属性,就从头开始生成大表。当某些东西发生变化时,从空间中进行核对并再次生成它。这样,数据主要以我们灵活的格式存储,但是从单个表中查询。

    这些生成的查找表是Magento“索引”。重新编制索引时,您正在炸毁旧表并再次生成它。

    希望澄清一点事情!

    谢谢, 乔

答案 1 :(得分:8)

Magento索引与普通数据库索引不相似,更像是数据库非规范化(http://en.wikipedia.org/wiki/Denormalization)进程。在大多数情况下,它采用EAV结构并使其可用于平台结构,毫无疑问,访问和搜索更快。

如果您的正常EAV查询将是200个左连接以获取目录和数据中的所有产品的属性和分层导航值,那么在“索引”之后,这些数据可通过非规范化数据结构获得,以便更快地查询/访问

答案 2 :(得分:3)

Magento索引在某种程度上类似于普通的数据库索引,但差别在于你需要在某些情况下手动完成。

当您进行索引编制时,例如目录索引,然后它将您的目录产品输入到单独的表中以进行不同类型的排序。一个小例子是存储,假设您有一个产品和不同商店的不同细节,然后首先它将从单独的表中的复杂连接中获取记录(当您将执行索引时)

其他最佳示例是分层导航索引:如果您将运行分层导航索引,那么它将通过过滤器属性检查产品数据库中的所有商店,然后在每个属性上如何产品可用,它还将存储该值。

如果您正在进行一些直接的数据库更改或通过自己的自定义代码,则主要需要这种类型的索引

如果您对索引有其他疑问,请与我们联系