2010-04-20 59 views
0

我有类似如下的表结构:可伸缩的方式与许多加入了许多表

user 
    id 
    name 

profile_stat 
    id 
    name 

profile_stat_value 
    id 
    name 

user_profile 
    user_id 
    profile_stat_id 
    profile_stat_value_id 

我的问题是:

如何评估一个查询,我想找到所有有多个统计信息的用户有profile_stat_id和profile_stat_value_id?

我试过做一个内部自我加入,但是当搜索许多统计信息时,它很快就会变得疯狂。我也试着对实际的user_profile表进行计数,这样会更好,但仍然很慢。

有一些神奇的我失踪?我在user_profile表中有大约1000万行,并且希望查询不超过几秒钟。那可能吗?

回答

0

通常数据库能够以一个体面的方式来处理一千万条记录。在大量数据的专业环境中(大约3000万到4000万行),我主要使用oracle,甚至在表上执行连接查询从未花费超过一秒或两秒的时间运行。

关于重要lessson我认识到,只要查询性能不好就要查看索引是否在连接字段上正确定义。例如。这里有profile_stat_id和profile_stat_value_id(我假设是主键的user_id)索引应该定义索引。如果你没有这样做,这肯定会给你一个很好的性能提升。 在定义索引后,运行查询一次或两次以使DB有机会在验证增益之前计算索引树和查询计划

0

表面上看来,您似乎要求这样做,其中不包含自连接:

SELECT u.name, u.id, s.name, s.id, v.name, v.id 
    FROM User_Profile  AS p 
    JOIN User    AS u ON u.id = p.user_id 
    JOIN Profile_Stat  AS s ON s.id = p.profile_stat_id 
    JOIN Profile_Stat_Value AS v ON v.id = p.profile_stat_value_id 

如果相应的表不需要有匹配的条目,则可以将列出的任何连接更改为LEFT OUTER JOIN。所有这些都是将中央User_Profile表与其他三个表中的每个表连接在适当的连接列上。

如果你认为你需要自加入?

[我没有包括任何东西来过滤'多个统计';我对这个问题的部分意味着什么并不清楚。]