我有一个表,其列为varchar(50)和float。我需要(很快)看一下与给定字符串关联的浮点数。即使使用索引,这也相当慢。
varchar(50)
float
但是,我知道每个字符串都与一个整数相关联,在查找时我知道该整数,因此每个字符串都映射到一个唯一的整数,但是每个整数都没有映射到一个唯一的字符串。有人可能会认为它是一种树状结构。
通过将此整数添加到表中,对其进行索引并使用类似以下的查询,有什么要获得的:
SELECT floatval FROM mytable WHERE phrase=givenstring AND assoc=givenint
这是Postgres,如果您不知道,我对数据库的经验很少。
VARCHAR列上的键可能会很长,这会导致每页更少的记录和更多的深度(中的更多级别B-Tree)。较长的索引也会增加高速缓存未命中率。
VARCHAR
B-Tree
平均有多少个字符串映射到每个整数?
如果相对较少,则只能在整数列上创建索引,PostgreSQL并对记录进行精细过滤:
PostgreSQL
CREATE INDEX ix_mytable_assoc ON mytable (assoc); SELECT floatval FROM mytable WHERE assoc = givenint AND phrase = givenstring
您还可以考虑在字符串哈希上创建索引:
CREATE INDEX ix_mytable_md5 ON mytable (DECODE(MD5(phrase), 'HEX')); SELECT floatval FROM mytable WHERE DECODE(MD5(phrase), 'HEX') = DECODE(MD5('givenstring'), 'HEX') AND phrase = givenstring -- who knows when do we get a collision?
每个散列只有16字节长,因此索引键将更短,同时仍几乎完美地保留了选择性。
16