繁体   English   中英

需要帮助的mysql连接

[英]need help with mysql joins

Users table
 user_id
 pic_url
 name

friends table
 auto_id
 userid
 friendid
 status

actions table
 auto_id
 userid
 type
 subject
 body
 datetime

我想让更新的朋友流显示更新,可以是博客文章,状态更改等,但只能显示来自已登录用户的朋友的更新

这是我想出的,但是我的用户群很大,因此性能是必须的,是否有更好的方法呢? 请给我看

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

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

可以说有50,000个用户,我的用户ID是#1,我是20,000个用户的朋友,它应该返回由我作为朋友的用户发布的动作表中的所有条目,还需要修改以包含我自己的动作

我听说有人谈论使用某种哈希表进行更快的查找,这里可能会发生这种情况吗?

谢谢你的帮助

我听说有人谈论使用某种哈希表进行更快的查找,这里可能会发生这种情况吗?

这称为索引 ,您应该使用JOIN(或与显式约束(例如>, >=, =, <=, <或仅匹配IN ()IN ()子句匹配IN ()在要计划的每一列上添加一个索引说明清单中的项目)。 这样,数据库服务器可以直接跳到索引中的正确条目,而不必在所有表行中进行蛮力搜索。 就像书中的索引一样。 如果要查找名称为“ Knuth”的书中的页面,则有两种选择。 如果这本书有索引,您可以在索引中查找并希望其中有名称。 如果这本书没有索引,那么您只需要自己阅读整个内容,这将花费更长的时间。

如果您关心排序/排序(或进行任何形式的相对数字/字符串比较),则它应该是排序索引。 否则,它可以是哈希表索引,这对于具有很多行的表来说更快,但是没有排序信息。 这些类型的详细信息可能使用不同的语法/选项,具体取决于所使用的数据库服务器软件的类型。**(请参阅下面的注释)

请注意,主键已经具有自动生成的索引,因此您不必自己添加一个。 还请注意,如果您有一个多列主键,例如(州,城市,邮政编码),则主键的最左侧子集将有效地存在索引,例如,您获得了State的索引,而(State,City) ,和(State,City,Zipcode)是免费的,但是如果您想在Zipcode或City或(City,Zipcode)上加入JOIN,则除了主键提供的索引之外,还需要创建自己的索引。

在您的情况下,您似乎应该在这些列上有索引(我*-我假定的列已经是主键)。 除非您对用户ID的数字顺序有任何意义,否则这些将是哈希表索引的良好候选者。

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

**对于MySQL,您在CREATE INDEX语句中添加了一个子句,该子句表示将USING HASH用于哈希表索引,或将USING BTREE(用于排序索引)...忽略RTREE,因为它们是空间数据。 还要注意,MySQL不允许在通用存储引擎InnoDB和MyISAM上使用HASH索引。 真正需要高性能的大型数据集可能需要将数据镜像到带有HASH索引的内存表中。 拥有50,​​000行,您可能不必担心它。 BTREE的搜索时间为O(log n),而HASH的搜索时间为O(1),并且差别可能不大。 BTREE非常宽,并且设计得不深; 要在搜索步骤中进行一次单独的比较,您可能需要将行数增加10或100。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM