欢迎,
我需要一些建议来改善我的网络应用程序的性能。
在开始时我有这种数据库结构:
USER
-id(主键)
-name
-password
-email ....
PROFILE
- 用户主键,外键(USER)
- 生日
-region
-photoFile ...
PAGES
-id(主键)
- 用户外键(USER)
-page
-date
COMMENTS
-id(主键)
- 用户外键(USER)
-page外键(PAGE)
-comment
-date
FAVOURITES_PAGES
-id(主键)
- 用户外键(USER)
-favourite_page外键(PAGE)
-date
但现在网站最重要的一页是天文台,每个人都可以观察其他用户的活动。 因此,我需要选择一些用户的所有页面,评论和收藏页面,并将其显示在一个列表中,按日期排序。
为了获得更好的性能(我认为),我将结构改为:
table USER and PROFILE without changes
ACTIVITY (additional table- have common fields: user,date)
-id (Primary Key)
-user Foreign Key(USER)
-date
-page Foreign Key(PAGE)
-comment Foreign Key(COMMENTS)
-favourite_page Foreign Key(FAVOURITES_PAGES)
PAGES
-id (Primary Key)
-page
COMMENTS
-id (Primary Key)
-page Foreign Key(PAGE)
-comment
FAVOURITES_PAGES
-id (Primary Key)
-favourite_page Foreign Key(PAGE)
所以现在很容易从所有表中获取排序记录。 但我在ACTIVITY表中不仅有PAGES,COMMENTS和FAVOURITES_PAGES的外键 - 大约有十个外键字段,在一条记录中只有一个有值,其他有无:
ACTIVITY
id user date page comment ...
1 2 2010-02-23 None 1
2 1 2010-02-21 1 None
....
这是核心解决方案。 当我在一个页面(分页)中显示大约40条记录时,我必须等待大约一秒钟,但数据库几乎是空的(少数用户和其他表中的大约100条记录)。这取决于每页的金额记录 - 我已经检查了它,但为什么它需要太长时间,因为关系?
该网站使用Python / Django构建。
任何建议/意见?
答案 0 :(得分:0)
您对数据库使用了什么?如果您使用的是Oracle,则可以使用Grid监视查询性能,以找出它们运行缓慢的原因。我想如果你寻找它们,其他数据库有类似的查询分析功能和工具。
另外 - 您的索引方案是什么?每次进行连接时,您用作外键的字段是索引还是数据库都在运行全表扫描?
答案 1 :(得分:0)
网站是用Python / Django构建的。
在排查性能时,请使用“分而治之”方法。你在谈论你的数据库结构,但你提到了python / django。这告诉我你真的不确定它是数据库问题,应用程序问题,还是Web服务器问题。
我认为你和我都假设它是数据库。因此,当Python / Django不是一个因素时,运行测试以查看数据库性能是否很慢。
使用您的网络应用程序将使用的相同查询,直接在您的数据库管理工具(PHPMyAdmin等)中运行它们。当您使用PHPMyAdmin执行查询时,它是否会在大约一秒内返回您的40行?如果是这样,那么您就知道您的数据库设计或查询速度很慢。如果它立即返回,那么它与应用程序或应用程序访问数据库的方式有关。