问题描述
我有一个包含许多URL的MysqL表,可以将URL以其原始形式存储,也可以将其存储为md5()值。
然后将其设置为索引列,以便可以更快地选择它们。
我想知道使用md5是否会带来任何性能优势,主要是因为考虑到数据始终具有相同的字符串大小(32),而不是存储长度范围从6个字符到128个或更多个字符的普通网址。 >
数据长度大致相同,我选择了20万条随机记录,并比较了url和md5(url)字符串大小:
total_url_chars: 7085326
total_hash_chars: 6400000
解决方法
简短的答案:请勿打扰使用md5。
详细答案:
- 您的代码等的复杂性不容忽视。
- 固定长度与可变长度不影响性能。
- MD5将更快地“不同”,通常在前5个字符以内。在发现不匹配之前,URL通常必须走得更远。也就是说,使用md5,“比较”会更快。我认为这种差异不足以缩小规模。
- 打包MD5(
print(df1) ab result 0 Sl2 25 1 Sl4 30 2 Ss 11 3 Tu4 NaN 4 Slu 33 5 Su2/Su3 NaN 6 Ut2 NaN 7 Ss 11 8 Sl2 25 9 Slu 33 10 Slu 33
->UNHEX(MD5(...))
会缩小MD5的占用空间,但是摆脱MD5会进一步缩小其覆盖范围。 - 如果URL太大而无法容纳在索引中,则必须执行某些操作。 (您说限制为128个字符吗?)
- 添加另一列会以次要量损害所有查询的性能。 (同样,这不应该使秤小费。)