可扩展的自我连接方式与多对多表

时间:2010-04-20 04:55:52

标签: mysql performance database-schema self-join

我有一个如下表结构:

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万行,并且希望查询不超过几秒钟。这可能吗?

2 个答案:

答案 0 :(得分:0)

通常,数据库能够以体面的方式处理1000万条记录。我在我们的专业环境中大多使用了oracle,其中包含大量数据(大约30-40万行),甚至对表进行连接查询也从未花费过一两秒钟的时间来运行。

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

答案 1 :(得分: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表与相应连接列上的其他三个表连接起来。

您认为自己需要自我加入?

[我没有包含任何内容来过滤“众多统计数据”;对我来说,问题的这一部分意味着什么并不清楚。]