设计一个数据库,用于存储5亿个带全文搜索的域名

时间:2015-06-28 08:12:15

标签: 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作为UNIQUE索引(使用MySQL - InnoDB)。
  3. 批量查询域名。例如:SELECT * FROM tbl_domains LIMIT 300000, 600;
  4. 你怎么看?该表会保存数亿条记录吗? 如何通过域名的第一个字母进行分区,这样会好吗? 让我知道你的建议,我很开明。

1 个答案:

答案 0 :(得分:1)

  • 分区不太可能带来任何好处。当然,如果你在第一个字母上进行分区。

  • 请勿使用OFFSETLIMIT进行批处理。而是“记住你离开的地方”。有关详细信息,请参阅my blog

  • 如果您宣布domain_extINT,那么我问为什么? INT需要4个字节。 .com也是如此。即使您使用SMALLINT.uk进行反击,我也会反击“小差异并不能证明复杂性。”

编辑(在UNIQUE上)

非分区表可以具有UNIQUE索引。 (注意:PRIMARY KEY UNIQUE索引。)当您拥有UNIQUE索引时,检查唯一性几乎是即时的,即使对于500M行也是如此。 (向下钻取大约5个BTree级别非常快。)

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

结论:在这种情况下进行唯一性检查,PARTITIONing的速度不会更快。