2009-07-24 108 views
1
Users table 
user_id 
pic_url 
name 

friends table 
auto_id 
userid 
friendid 
status 

actions table 
auto_id 
userid 
type 
subject 
body 
datetime 

我想进行更新,多数民众赞成的朋友流中显示的更新,可能是一个博客帖子,状态变化,任何事情,但应该只表明是从登录的用户的朋友的人需要帮助与MySQL连接

这是我想出来的,但我的用户基数非常大,所以性能是必须的,有没有更好的方法来做到这一点?请告诉我

SELECT u.user_id, u.pic_url, u.name, a.auto_id, a.userid, a.type, a.subject, a.body, a.datetime 
FROM actions AS a 
LEFT JOIN users AS u ON u.auto_id=a.userid 
LEFT JOIN friends AS f ON f.userid=a.userid 
WHERE f.friendid=1 //1 would be my user ID 
AND f.status=active 

请帮助我不认为这是正确的。

假设有5万个用户,我的用户名为#1,而我是拥有20,000名用户的朋友,它应该返回由用户发布的用户发布的操作表中的所有条目,还需要修改以包含我自己的动作

我听说过一些人使用某种哈希表进行快速查找会有这样的事情吗?

感谢所有帮助

回答

3

我听到有些人talki约 使用某种哈希表的 更快的查找速度会像 这是可能的吗?

这就是所谓的index,你应该添加一个到你在使用JOIN(或类似>, >=, =, <=, <一个明确的约束或在规定列表只匹配项目的IN()条规则)计划每列。通过这种方式,数据库服务器可以直接跳转到索引中的正确条目,而不必对所有表格行进行蛮力搜索。这完全像书中的索引。如果你想在名为“Knuth”的书中找到页面,你有两种选择。如果这本书有索引,你可以查看索引并希望这个名字在那里。如果这本书没有索引,那么你只需要自己阅读整件事情,而这需要更长的时间。

如果你关心排序/排序(或者做任何类型的相对数字/字符串比较),它应该是一个排序索引。否则,它可能是一个散列表索引,对于有很多行的表更快,但不包含排序信息。这些类型的细节可能会根据使用哪种数据库服务器软件而具有不同的语法/选项。**(请参阅下面的注释)

请注意,主键已经具有自动生成的索引,因此您不需要必须自己添加一个。另请注意,如果您有多列主键,例如(州,城市,邮政编码),那么在主键的最左边的子集上将有效地存在索引,例如,你可以免费获得州和州(州,城市)和(州,城市,邮编)的索引,但是如果你想加入邮编或城市或(城市,邮编),那么你需要创建自己的索引除了由主键提供的那些。

在你的情况,它看起来像你应该在这些列上的索引(我* *列我假设已经是主键)。除非您对用户标识的数字顺序有任何意义,否则这些将成为散列表索引的良好候选者。

Users.user_id* 
Friends.user_id 
Friends.friend_id 
Friends.active 
Actions.user_id 

**对于MySQL,你的条款添加到使用说HASH的哈希表的索引或使用BTREE(用于排序索引)的CREATE INDEX statement ...忽略的rtrees那些用于空间数据。还要注意,MySQL不允许在公共存储引擎InnoDB和MyISAM上使用HASH索引。需要高性能的真正大型数据集可能需要在具有HASH索引的内存表中镜像数据。 50,000行,你可能不需要担心它; BTREE的搜索时间是O(log n),而HASH是O(1),可能没有太大的差别。 BTREE非常宽,设计不深;要在搜索步骤中进行一次额外比较,您可能需要将行数增加10或100倍。

+2

更多有关索引的阅读http://www.alistapart.com/articles/indexing-the -web-its-not-just-googles-business/ – 2009-07-24 00:36:21