我正在收集几百万行包含URL的数据。要消除这些重复,我需要在插入新行之前搜索现有的url。因此,我想在该列上创建一个索引。知道大多数URL都以 http:// 或者 https:// ?
http://
https://
i7uq4tfw1#
对于几百万行,基本上不可能 MD5(URL) 会发生意外碰撞。是32个十六进制数字( CHAR(32) CHARACTER SET ascii ). 或者更好 UNHEX(...) 把它放进去 BINARY(16) .然后添加一个 UNIQUE 列上的索引。你用的是什么版本?一些新版本的mariadb有类似的内置。
MD5(URL)
CHAR(32) CHARACTER SET ascii
UNHEX(...)
BINARY(16)
UNIQUE
s4n0splo2#
有两种方法可以在长字符串上添加索引:为crc32(url)添加索引,只需添加一个名为 crc32_urls 并在此基础上创建索引。可能有些URL与crc32(URL)的结果相同,因此每次搜索时应按以下方式运行:
crc32_urls
SELECT * FROM table WHERE crc32_urls = xxx AND urls = xxx
使用prefix index.来假设前缀的长度应该是多少。您可以通过
SELECT COUNT(DISTINCT urls)/COUNT(*) FROM table
与
SELECT COUNT(DISTINCT left(urls, x))/COUNT(*) FROM table
这个 x 是您指定的长度。当两个数字接近时,请选择“最小长度”。
x
2条答案
按热度按时间i7uq4tfw1#
对于几百万行,基本上不可能
MD5(URL)
会发生意外碰撞。是32个十六进制数字(CHAR(32) CHARACTER SET ascii
). 或者更好UNHEX(...)
把它放进去BINARY(16)
.然后添加一个
UNIQUE
列上的索引。你用的是什么版本?一些新版本的mariadb有类似的内置。
s4n0splo2#
有两种方法可以在长字符串上添加索引:
为crc32(url)添加索引,只需添加一个名为
crc32_urls
并在此基础上创建索引。可能有些URL与crc32(URL)的结果相同,因此每次搜索时应按以下方式运行:使用prefix index.来假设前缀的长度应该是多少。您可以通过
与
这个
x
是您指定的长度。当两个数字接近时,请选择“最小长度”。