我在MySQL中有一个类似于Instagram的数据库结构,我有一个包含文件系统中图片路径的表和一个包含用户信息的表:
用户:
ID | userName | age | gender
---|-----------|-----|-------
1 | MrBanana | 15 | 0
2 | BobTheMan | 21 | 0
3 | TheBest | 19 | 1
4 | MsTest | 24 | 1
图片:
ID | Path | userID
---|-----------|--------
1 | www.test1 | 2
2 | www.test2 | 4
3 | www.test3 | 3
4 | www.test4 | 2
现在的要求是,无论何时调用图片,它都将包含userName和ID。所以我的第一个想法是创建一个连接两个表的视图,以便图片现在还具有附加到其上的图像的用户名和ID,然后从该视图中查询图片。查询将放在存储过程中。现在我的问题是,如果这是有效的,或者它是否更高效地进行查询并加入一个雄蕊并将其放入存储过程?
我担心的是,如果我使用视图方法,每次查询视图时,它必须首先加入两个表的整体,如果这些表变得非常大,这将是一个非常耗时的过程。因此,如果我创建一个存储过程,首先找到所有需要的图片,然后将用户加入它,那将更有效。
我不确定我是否正确理解这一点,并希望就哪种方法更好并且更有效地扩展来寻求帮助?
答案 0 :(得分:1)
不确定您使用的是哪个RDBMS,但根据我对SQL Server的经验(我猜其他供应商也这样做),普通视图会使用索引 视图查询中包含的表格,就好像您在视图外部进行查询一样。
因此,如果你担心你的vwPicturesWithUser在查询ID = 3的图片时是否会使用Pictures表的索引,答案是肯定的(我想有人可能会想出一些奇怪的情况,其中查询planner决定忽略索引,但是在没有视图的情况下会发生太查询。