如何在超过 100 亿行的海量数据集上执行选择

Posted

技术标签:

【中文标题】如何在超过 100 亿行的海量数据集上执行选择【英文标题】:How to perform select on a massive dataset of 10 billion+ rows 【发布时间】:2016-02-11 00:11:48 【问题描述】:

用户注册时,邮箱必须是唯一的,注册检查时间最长为1秒。

Facebook / Google 如何设法在具有数十亿行的表上执行选择,并检索即时响应。

是不是就这么简单:

select email from users where email = "xxx@yyy.zzz" limit 1

email 字段上有一个索引并在超快的服务器上运行这个查询可以解决问题吗?

或者还有更多内容?

【问题讨论】:

跨多个节点/服务器对数据进行分区。分区通常是一些可以合理分散大型数据集的键。所有喜欢这个分区的花椰菜的人。然后,您可以轻松缩小搜索范围。甚至更好...所有电子邮件的人在此服务器上都以 s,t,r 开头。 @ahojvole 如果我记得他们使用技巧根据某些条件将其拆分到多个数据库。此外,使用 noSQL 等技术可以提高速度,DB 的工作方式是减去集合和二叉树,这些都有助于快速召回,同时保持可扩展性 【参考方案1】:

简短的回答,是的。虽然有这么多的数据,但我认为您可能想要研究分片等事情,以使事情变得更快

使用 SQL 时,可以通过使用主键来确保索引和唯一性。然后驱动数据库的后端使用这些主键来确保表中没有重复。因为键用于索引表中的行,这也意味着由于这些索引,即使是大量数据的查找也会快得多。将主键设置为电子邮件地址,在这种情况下你应该很好。

即使在使用 Mongo、Cassandra 等 NoSQL 数据库时,也有必要为您的数据创建索引以便快速查找。

【讨论】:

以上是关于如何在超过 100 亿行的海量数据集上执行选择的主要内容,如果未能解决你的问题,请参考以下文章

Postgres- pgsql 花费更多时间从超过 15 亿行的表中检索数据

具有超过十亿行的表的 Postgres 性能

我应该在包含超过十亿行的mysql数据库设计中使用啥方法来使用最少的时间找到特定的值?

HBase海量数据存储

删除实时数据库上超过 17 亿行的未索引表(SQL Admin Nightmare)

mongodb使用map reduce从其他集合中插入嵌入文档海量集合