Magento的索引与精神上的数据库级索引相似。正如安东所言,这是一个非正规化的过程,可以让网站的运行速度更快。让我试着解释一下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的“索引”。当您重新编制索引时,您将炸毁旧桌子并重新生成。
希望澄清事情有点!
谢谢, 乔
不熟悉Magento的,但你的意思是在数据存储在Magento的方式吗?索引意味着MySQL索引,对此已经有大量的信息可用。 – richsage 2011-02-09 13:16:57
在Magento中,有很多索引表用于重新索引数据库中的数据。如果你说的是同一件事,我就不那么熟悉了。也许是这样,也许我错过了正常的MySQL索引,如果这是一回事。 – 2011-02-09 13:32:03