多个Mysql交叉引用表,或一个(通过添加一个存储引用类型的额外字段)

时间:2011-02-15 06:38:51

标签: mysql optimization

prx_tags_sportsitems和prx_tags_fishingitems是将sportsitem / fishing项目(OwnerID)链接到Tag(TagID)的交叉引用表。

为每种类型的项目设置单独的交叉引用表或组合它们会更好吗?在我的REAL数据库中,我有10种以上的项目,这就是我考虑加入的原因他们,但我想知道查询的速度是否会受到影响。

所以它是:

  

CREATE TABLE prx_tags_sportsitems(
  TagID int(10)unsigned NOT NULL,
  OwnerID int(10)unsigned NOT NULL,
  PRIMARY KEY(TagID,OwnerID));

     

     

创建表prx_tags_fishingitems(
  TagID int(10)unsigned NOT NULL,
  OwnerID int(10)unsigned NOT NULL,
  PRIMARY KEY(TagID,OwnerID));

     

使用查询:

     

SELECT prx_sportsitems。* FROM   prx_sportsitems,prx_tags_sportsitems   在哪里prx_tags_sportsitems.OwnerID =   prx_sportsitems.ID AND   prx_tags_sportsitems.TagID =(SELECT   ID FROM prx_tags WHERE TagName =   '有氧')ORDER BY   prx_sportsitems.DateAdded DESC LIMIT   0,30;

     

...再次查询prx_tags_fishingitems

OR,通过使用“OwnerType”来区分sportsitems和fishingitems,将这些表连接成一个表更好吗?像这样:

  

CREATE TABLE prx_tags_items(
  TagID int(10)unsigned NOT NULL,
  OwnerID int(10)unsigned NOT NULL,
  OwnerType varchar(255)NOT NULL,
  PRIMARY KEY(TagID,OwnerID));

     

使用查询:

     

SELECT prx_sportsitems。* FROM   prx_sportsitems,prx_tags_items   在哪里prx_tags_items.OwnerID =   prx_sportsitems.ID AND   prx_tags_items.TagID =(选择   ID FROM prx_tags WHERE TagName =   '有氧')和   prx_tags_items.OwnerType =' sportsitems 'ORDER BY   prx_sportsitems.DateAdded DESC LIMIT   0,30;

     

...再次针对prx_fishingitems进行查询,将OwnerType设置为“fishingitems”

我喜欢使用OwnerType连接表的想法,因为我可以轻松地创建一个新的OwnerType而不为每个OwnerType创建一个新的交叉引用表,但我担心的是,当添加时它会显着减慢mysql查询速度这一行:

  

AND prx_tags_items.OwnerType =' [此处所有者项目类型] '

我感谢任何帮助和建议。我想尽快开始:)

更新:是否会为“OwnerType”帮助添加索引(主键)?

1 个答案:

答案 0 :(得分:1)

我认为在这种情况下交叉引用表可能是一个优先事项,但随着数据集的增长,对于您自己以及应用程序不断增长的需求继续保持这种情况可能会变得很麻烦。 / p>

相反,我会重写上面的查询以消除子查询和隐含连接。我还会在评估的任何内容上添加索引。

第一次脸红重写看起来像这样:

select * from prx_sportsitems psi
left join prx_tags_items pti on (pti.ownerid=psi.id)
left join prx_tags pt on (pti.tagid=pt.id)
where pt.tagname = 'aerobic'
and pti.ownertype='sportsitems'
order by psi.dateadded desc
limit 0,30

以下列中需要索引:

  • prx_sportsitems.id
  • prx_tags_items.id
  • prx_tags.id
  • prx_tags.tagname
  • prx_tags_items.ownertype

此外,除非绝对必须,否则不要排序!

祝你好运!