我必须在数据库中存储数百万个URL,并且能够快速通过URL查找行。
MySQL 的字符串索引不够快,因为它们只索引字符串的前4个字符,通常为www.
,然后MySQL迭代每个字符串那些以www.
开头的行,并将该值与我搜索的URL进行比较。
MongoDB 不允许您自定义字符串索引的字符数和the docs aren't very detailed,因此我认为MongoDB不合适。
Google App Engine 有一个特殊的网址类型,这很棒,但我不能使用GAE。
有什么建议吗?
答案 0 :(得分:8)
MySQL的字符串索引不够快,因为它们只索引字符串的前4个字符,通常是www。然后MySQL迭代这些以www开头的行。并将该值与我搜索的URL进行比较。
事实并非如此。对于MySQL
,1000
MyISAM
和767
字节可以为InnoDB
个字节编制索引。
如果您只需要为URL
字符串进行文字匹配,请为其哈希值编制索引。
如果您使用16
之类的内容,这将使您的索引大小保持较低(每个键MD5
个字节),并且键值将均匀分布。
答案 1 :(得分:0)
如果您使用MySQL,请阅读High Performance MySQL (2nd ed.)的第103-104页(链接允许您搜索内部书籍 - 查找“pseudohash”),其中包含用于索引URL的哈希方法。最重要的是,它建议使用MySQL的CRC32功能代替MD5以获得更好的性能,因为它可以产生更短的值,可以更快地进行比较。