Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在搜索海量数据库时提高速度_Php_Mysql_Facebook_Apache_Rdbms - Fatal编程技术网

Php 在搜索海量数据库时提高速度

Php 在搜索海量数据库时提高速度,php,mysql,facebook,apache,rdbms,Php,Mysql,Facebook,Apache,Rdbms,我是数据库新手。我对数据库中的一些东西感到好奇。例如,我看到了Facebook存储朋友关系的结构(请参阅:)。只有两列,第一个用户id和第二个用户id。没关系 正如维基百科所说,facebook拥有约10亿活跃用户。所以在朋友关系表中,大概有1000亿行。在那张表中搜索速度非常快(例如:查看我的朋友列表)。我想知道他们是如何以这样的速度做的 是不是因为Facebook有一些神奇的后端?还是数据库的魔力?我也可以使用PHP和MySQL(拥有数百万用户并在几秒钟内搜索数据库)吗 (我可能会问一个愚蠢

我是数据库新手。我对数据库中的一些东西感到好奇。例如,我看到了Facebook存储朋友关系的结构(请参阅:)。只有两列,第一个用户id和第二个用户id。没关系

正如维基百科所说,facebook拥有约10亿活跃用户。所以在朋友关系表中,大概有1000亿行。在那张表中搜索速度非常快(例如:查看我的朋友列表)。我想知道他们是如何以这样的速度做的

是不是因为Facebook有一些神奇的后端?还是数据库的魔力?我也可以使用PHP和MySQL(拥有数百万用户并在几秒钟内搜索数据库)吗


(我可能会问一个愚蠢的问题,但知道这一点总是让我感到困扰,请留下答案)

性能可能来自索引、缓存和存储

数据库利用。通过这种方式,它可以快速找到与给定用户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))

--

关于


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

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

即使这样做,您也必须搜索整个表?太神奇了!如果您还添加以下内容,那就太好了:它们如何在db服务器之间同步?他们如何备份TB级的数据?为什么他们的服务器从不崩溃?很抱歉,我真的不明白。什么是log(N)?那么1024是user1和user2的索引?如果friends表中有1024对情侣,从二进制索引中搜索他们只需要执行10(最大)个比较(而不是1024个)。现在我知道了。更多的是数学,不是吗?很好的回答!!!