[英]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.