文本字段越长,在这个字段上建索引的代价就越高。
为了解决这个问题,可以为这个字段配一个hash字段,然后在这个hash字段上建索引。
如,
select * from log where url_hash= CRC32('http://bing.com?query=xxx&tp=xxx' )
crc32()返回的值一般比较短,比较合适; 如果用md5或sha1做hash, 返回的值也很长,那就失去意义了。
不过,像上面这样写可能存在hash collision问题,所以应该加个原字段上的搜索条件,确保搜出来的是自己想要的:
select * from log where url_hash= CRC32('http://bing.com?query=xxx&tp=xxx' ) and url = ''http://bing.com?query=xxx&tp=xxx'
另一种类似的方案是: 不用hash值,而用前缀。
这里有提到。