我有点了解Magento中的索引是如何工作的,但我还没有看到任何关于此的好文档。我想知道以下内容。
我认为拥有这些信息对我船上的其他人来说非常有用,而这些信息并没有完全得到索引过程。
更新: 在对我的问题和Ankur的回答发表评论之后,我想我错过了一些关于正常数据库索引的知识。那么这只是Magento处理索引的版本,对我来说更好的是通常在数据库索引方面得到我的答案,例如这里的链接How does database indexing work?
答案 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
(一个简单的例子),我需要找到:
product_id
(在产品表中)attribute_id
color
(在属性表中)value
(在attribute_values表中)Magento曾经像这样工作,但它已经慢了。因此,为了获得更好的性能,他们做出了妥协:一旦店主定义了他们想要的属性,就从头开始生成大表。当某些东西发生变化时,从空间中进行核对并再次生成它。这样,数据主要以我们灵活的格式存储,但是从单个表中查询。
这些生成的查找表是Magento“索引”。重新编制索引时,您正在炸毁旧表并再次生成它。
希望澄清一点事情!
谢谢, 乔
答案 1 :(得分:8)
Magento索引与普通数据库索引不相似,更像是数据库非规范化(http://en.wikipedia.org/wiki/Denormalization)进程。在大多数情况下,它采用EAV结构并使其可用于平台结构,毫无疑问,访问和搜索更快。
如果您的正常EAV查询将是200个左连接以获取目录和数据中的所有产品的属性和分层导航值,那么在“索引”之后,这些数据可通过非规范化数据结构获得,以便更快地查询/访问
答案 2 :(得分:3)
Magento索引在某种程度上类似于普通的数据库索引,但差别在于你需要在某些情况下手动完成。
当您进行索引编制时,例如目录索引,然后它将您的目录产品输入到单独的表中以进行不同类型的排序。一个小例子是存储,假设您有一个产品和不同商店的不同细节,然后首先它将从单独的表中的复杂连接中获取记录(当您将执行索引时)
其他最佳示例是分层导航索引:如果您将运行分层导航索引,那么它将通过过滤器属性检查产品数据库中的所有商店,然后在每个属性上如何产品可用,它还将存储该值。
如果您正在进行一些直接的数据库更改或通过自己的自定义代码,则主要需要这种类型的索引
如果您对索引有其他疑问,请与我们联系