mysql - 设计一个可存储 5 亿个域名并具有全文搜索功能的数据库

标签 mysql database-design

我即将构建一个可存储多达 5 亿条域名记录的应用程序。 我将索引“.net”或“.com”部分,并在开头删除“www”。 所以我相信表格看起来像这样:

domain_id | domain_name  | domain_ext
----------+--------------+-----------
1         | dropbox      | 2
2         | digitalocean | 2

domain_ext = 2 表示它是“.com”域。

我要执行的查询::

  1. 我需要能够轻松插入新域。
  2. 我还需要确保没有插入重复项(每个域应该只有 1 条记录),因此我认为将 domain_name + domain_ext 作为唯一索引(使用 MySQL - InnoDB) .
  3. 批量查询域名。例如:SELECT * FROM tbl_domains LIMIT 300000, 600;

你觉得怎么样?该表会保存数亿条记录吗? 按域名首字母分区怎么样? 让我知道您的建议,我很开放。

最佳答案

  • 分区不太可能提供任何好处。当然,如果您按第一个字母进行分区。

  • 不要使用 OFFSETLIMIT 进行批处理。相反,“记住你离开的地方”。请参阅my blog了解更多详情。

  • 如果您已将 domain_ext 声明为 INT,那么我问为什么? INT 占用 4 个字节。 .com 也是如此。即使你用 SMALLINT.uk 来反驳,我也会用“微小的差异并不能证明复杂性是合理的”来反驳。

编辑(在 UNIQUE 上)

非分区表可以有 UNIQUE 索引。 (注意:PRIMARY KEY一个UNIQUE索引。)当您有一个UNIQUE索引时,检查唯一性即使对于 500M 行,也几乎是瞬时的。 (深入 BTree 大约 5 层非常快。)

使用PARTITIONing,每个UNIQUE键必须包含“分区键”。如果域分割,则不能使用PARTITION BY RANGE。将扩展名(顶级域)拆分为 INT,您可以使用 BY RANGEBY LISTUNIQUE 是可能的,因为 TLD 既是分区键,又需要作为域的一部分。但它不会获得任何性能。查找将 (1) 选择分区(“分区修剪”),然后 (2) 向下钻取 BTree 的 4-5 层以到达要检查的行。

结论:进行唯一性检查虽然在这种情况下是可能的,但使用PARTITIONing不会更快。

关于mysql - 设计一个可存储 5 亿个域名并具有全文搜索功能的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31097475/

相关文章:

sql - SQL 查询中的双向关系

mysql - 需要数据库设计方面的帮助

database - 以牺牲 2NF 为代价获得参照完整性——这是一个合理的权衡吗?

mysql - 提取 MySQL 备份文件

mysql - 如何在mysql查询中为每个类别选择一条记录?

python - 如何让机器人框架等到数据出现在MySQL表上才继续测试用例执行

database-design - 关于餐 table 设计的问题

mysql - 表 A 上的外键 --> B,以及表 B 上的外键 --> A。这是怎么做到的?

php - 查询从三个表(Categories、Sub_Categories、Sub_Categories_ Three)获取数据并将其显示在 View 上

ruby-on-rails - 用户帐户设计和安全