2014-01-25 60 views
0

好吧,我一直在试图弄清楚这一点,但一直未能得出结论。我很想从你们那里得到一些结果,提示做更多的测试,或者更多的资源来阅读。针对1对*关系的MySQL优化

情况很简单。有一个主要的图片表。可能是cat_pictures。有一个cat_pictures_comments的辅助表。一些智能开发人员确保cat_pictures具有自动递增主键ID_PICTURE,并且注释也以ID_PICTURE的索引存储。

我们的应用程序有一个页面,想要显示所有的图片与所有的图片评论。

难道我们

  1. 只是INNER JOINcat_picturescat_pictures_comments(并确保一切都正确排序)

  2. 获取所有cat_pictures,然后遍历每个并获得cat_pictures_comments每个画面

答:如果应用程序是PHP呢? B:如果cat_pictures有猫的基因组的条目ID,图片文件路径和其他20,285个字段,该怎么办? cat_pictures也是INNER JOIN'与每个猫的所有者的精神病医生(一对一关系)编辑。 (基本上,与我们的小小便袋评论表相比,主表有更多的数据附加到主表。)

谢谢大家。

+0

这个问题还不清楚。答案是加入。考虑提供1-1数据的附件表,但前提是可以证明其具有显着的性能优势。如果有疑问,请进行测试。 – Strawberry

+0

对不起。这就是我所说的,我不确定如何衡量使用PHP来获取每张图片评论或使用查询获得它的好处。我得到的印象是PHP *可能会更好,因为存储和返回重复的'cat_pictures'数据的内存远远大于附加到图片的每个注释的小尺寸。 – Liandri

+0

虽然可能,但在实践中,这种假设极不可能。一般来说,数据库的“往返”次数越少越好 - “1”最佳。 – Strawberry

回答

1

我觉得你的问题是,你加入回意见,然后有一个查询,看起来像

选项1

select (all pic columns), (all comment columns) from pics inner join comments; 

比。选项2

Select * from pics; then loop and select * from comments were pictureId = @currentId; 

比。选项3

Select * from pics order by picId; select * from comments order by picId; 

在选项1中,您为照片的每个评论都发布了照片列的每一列。如果每幅图片有很多评论,而图片表非常宽,那么您最好从数据库中提取两个单独的数据集。

在选项2中,如果有许多图片,您将会过多地往返数据库。

基于缺乏完整的要求,我会推荐选项3.获取图片表结果和评论作为两个单独的数据集,然后在你的php页面:通过每个图片循环显示图片信息,然后嵌套循环到从已经从SQL Server提取的注释的本地数据集中获取当前图片的注释。

+0

我看不出赞成3的逻辑超过1.我认为你很难设计出3个表现不佳的场景,但会很乐意被证明是错误的。 – Strawberry

+0

@Strawberry,如果在“主”表中返回的数据过多,我觉得3 *可能*优于1 ...如果其中的数据量创建了足够大的数据开销。没有?因为对于每条评论,该数据在输出中都是重复的 – Liandri

+0

其他RDBMS可能会更好。尽管如此,MySQL喜欢(正确索引)数据。它处理它非常好。它将击败PHP。 – Strawberry