我是一个新数据库。我很想知道数据库中的一些东西。例如,我看到了Facebook如何存储朋友关系的结构(参见:https://developers.facebook.com/docs/reference/fql/friend)。只有两列,第一个用户ID和第二个用户ID。那没关系。
维基百科称,facebook拥有大约10亿活跃用户。所以在那个朋友关系表中,可能有大约1000亿行。搜索该表是超快的(例如:查看我的朋友列表)。我想知道他们是如何以这种速度做到的。
是不是因为Facebook有一些神奇的后端?或者它是数据库的魔力?我是否也可以使用PHP和MySQL来完成这项工作(拥有数百万用户并在数秒内搜索数据库)?
(我可能会问一个愚蠢的问题,但总是让我感到烦恼,请留下答案)
答案 0 :(得分:3)
数据库使用indexes。这样,它可以快速找到与给定用户ID相关的数据。
取决于索引结构,空间占用等......有一个增益,即不是搜索N列,而是搜索 - 例如 - log(N)
。通过二十亿行的二分法进行搜索
N = 100,000,000,000
将是
Search(N) : search log2(N) = search (36 rows)
相反,搜索10 ^ 12行,只需要分析36行。
在你提到的情况下,朋友,每个用户可能有几个朋友,所以
user1 => (userX, userY, userZ, ...)
userX => (userU, userV, user1, ...)
表示user1是userX,userY等的朋友... 即你不每个用户都有一个唯一索引。但是每个用户都有一个唯一的索引。
在Mysql上将是
UNIQUE(user1,user2)
表示情侣(user1,user2)在表格中只有一次。语法是
CREATE UNIQUE INDEX friendsindex ON friends(user1,user2)
friendsindex 是索引名称, friends 是表格。或者如您所说,将表主键声明为(user1,user2)
(每个表的主键是唯一的)。
-
赢得游戏的策略基于相同的原则,该策略包括找到给定对象的确切价格。假设价格在1到10000之间。您告诉价格,处理程序说+
或-
。您必须尽可能少地尝试查找价格。例如。价格是6000。
您可以从1
开始并将所有价格提供到6000
(即6000次尝试),但您也可以继续二分法
在每次迭代时将剩余范围除以2。您可以在12次尝试中找到6000次尝试(log2(6000))。
-
例如,如何在2^x = 1024
中找到x?或者x = log2(1024)
意味着基数2中的1024的对数(答案:10)。在我们的故事中,1024行表具有基于二叉树的索引,需要10次尝试(最大)才能找到正确的元素(而不是1024最大值)。
答案 1 :(得分:1)
性能可能来自索引,缓存和sharding。
答案 2 :(得分:0)