我即将构建一个存储多达5亿个域名记录的应用程序。 我将索引'.net'或'.com'部分并在开头删除'www'。 所以我相信这个表看起来像这样:
domain_id | domain_name | domain_ext
----------+--------------+-----------
1 | dropbox | 2
2 | digitalocean | 2
domain_ext = 2表示它是'.com'域。
我即将执行的查询::
domain_name + domain_ext
作为UNIQUE索引(使用MySQL - InnoDB)。SELECT * FROM tbl_domains LIMIT 300000, 600;
答案 0 :(得分:1)
分区不太可能带来任何好处。当然,如果你在第一个字母上进行分区。
请勿使用OFFSET
和LIMIT
进行批处理。而是“记住你离开的地方”。有关详细信息,请参阅my blog。
如果您宣布domain_ext
为INT
,那么我问为什么? INT
需要4个字节。 .com
也是如此。即使您使用SMALLINT
或.uk
进行反击,我也会反击“小差异并不能证明复杂性。”
编辑(在UNIQUE上)
非分区表可以具有UNIQUE
索引。 (注意:PRIMARY KEY
是UNIQUE
索引。)当您拥有UNIQUE
索引时,检查唯一性几乎是即时的,即使对于500M行也是如此。 (向下钻取大约5个BTree级别非常快。)
使用PARTITIONing
,每个UNIQUE
密钥必须包含“分区密钥”。如果域不拆分,则无法使用PARTITION BY RANGE
。将扩展程序(顶级域名)拆分为INT
,您可以使用BY RANGE
或BY LIST
。 UNIQUE
是可能的,因为TLD既是分区密钥又是域的一部分。但它不会获得任何表现。查找将(1)选择分区(“分区修剪”),然后(2)向下钻取4-5级BTree以到达行进行检查。
结论:在这种情况下进行唯一性检查,PARTITIONing
的速度不会更快。