我即将构建一个可存储多达 5 亿条域名记录的应用程序。 我将索引“.net”或“.com”部分,并在开头删除“www”。 所以我相信表格看起来像这样:
domain_id | domain_name | domain_ext
----------+--------------+-----------
1 | dropbox | 2
2 | digitalocean | 2
domain_ext = 2 表示它是“.com”域。
我要执行的查询::
- 我需要能够轻松插入新域。
- 我还需要确保没有插入重复项(每个域应该只有 1 条记录),因此我认为将
domain_name + domain_ext
作为唯一索引(使用 MySQL - InnoDB) . - 批量查询域名。例如:
SELECT * FROM tbl_domains LIMIT 300000, 600;
你觉得怎么样?该表会保存数亿条记录吗? 按域名首字母分区怎么样? 让我知道您的建议,我很开放。
最佳答案
分区不太可能提供任何好处。当然,如果您按第一个字母进行分区。
不要使用
OFFSET
和LIMIT
进行批处理。相反,“记住你离开的地方”。请参阅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 RANGE
或 BY LIST
。 UNIQUE
是可能的,因为 TLD 既是分区键,又需要作为域的一部分。但它不会获得任何性能。查找将 (1) 选择分区(“分区修剪”),然后 (2) 向下钻取 BTree 的 4-5 层以到达要检查的行。
结论:进行唯一性检查虽然在这种情况下是可能的,但使用PARTITIONing
不会更快。
关于mysql - 设计一个可存储 5 亿个域名并具有全文搜索功能的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31097475/