搜索大型数据库时速度快

时间:2013-02-03 16:36:39

标签: php mysql facebook apache rdbms

我是一个新数据库。我很想知道数据库中的一些东西。例如,我看到了Facebook如何存储朋友关系的结构(参见:https://developers.facebook.com/docs/reference/fql/friend)。只有两列,第一个用户ID和第二个用户ID。那没关系。

维基百科称,facebook拥有大约10亿活跃用户。所以在那个朋友关系表中,可能有大约1000亿行。搜索该表是超快的(例如:查看我的朋友列表)。我想知道他们是如何以这种速度做到的。

是不是因为Facebook有一些神奇的后端?或者它是数据库的魔力?我是否也可以使用PHP和MySQL来完成这项工作(拥有数百万用户并在数秒内搜索数据库)?

(我可能会问一个愚蠢的问题,但总是让我感到烦恼,请留下答案)

3 个答案:

答案 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次尝试),但您也可以继续二分法

  • 你:5000
  • 游戏玩家:+
  • 7500或(10000 - 5000)/ 2
  • -
  • 6250或(7500 - 5000)/ 2
  • -
  • 等...

在每次迭代时将剩余范围除以2。您可以在12次尝试中找到6000次尝试(log2(6000))。

-

关于logarithms

例如,如何在2^x = 1024中找到x?或者x = log2(1024)意味着基数2中的1024的对数(答案:10)。在我们的故事中,1024行表具有基于二叉树的索引,需要10次尝试(最大)才能找到正确的元素(而不是1024最大值)。

答案 1 :(得分:1)

性能可能来自索引,缓存和sharding

答案 2 :(得分:0)

Facebook拥有一个服务器群。我认为他们设置了一个集群或者其他东西,以便拥有几个相同的sql server副本。在这些sql数据库中,他们使用索引来加快搜索速度,但他们也可以在用户计算机上使用本地存储,这有助于他们获得更快的结果。