观察用户活动的简便方法 - 如何改进我的数据库结构

时间:2010-04-29 11:54:03

标签: database performance foreign-keys structure relationship

欢迎,

我需要一些建议来改善我的网络应用程序的性能。

在开始时我有这种数据库结构:

  

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构建。

任何建议/意见?

2 个答案:

答案 0 :(得分:0)

您对数据库使用了什么?如果您使用的是Oracle,则可以使用Grid监视查询性能,以找出它们运行缓慢的原因。我想如果你寻找它们,其他数据库有类似的查询分析功能和工具。

另外 - 您的索引方案是什么?每次进行连接时,您用作外键的字段是索引还是数据库都在运行全表扫描?

答案 1 :(得分:0)

  

网站是用Python / Django构建的。

在排查性能时,请使用“分而治之”方法。你在谈论你的数据库结构,但你提到了python / django。这告诉我你真的不确定它是数据库问题,应用程序问题,还是Web服务器问题。

我认为你和我都假设它是数据库。因此,当Python / Django不是一个因素时,运行测试以查看数据库性能是否很慢。

使用您的网络应用程序将使用的相同查询,直接在您的数据库管理工具(PHPMyAdmin等)中运行它们。当您使用PHPMyAdmin执行查询时,它是否会在大约一秒内返回您的40行?如果是这样,那么您就知道您的数据库设计或查询速度很慢。如果它立即返回,那么它与应用程序或应用程序访问数据库的方式有关。