一尘不染

varchar上的SQL索引

sql

我有一个表,其列为varchar(50)float。我需要(很快)看一下与给定字符串关联的浮点数。即使使用索引,这也相当慢。

但是,我知道每个字符串都与一个整数相关联,在查找时我知道该整数,因此每个字符串都映射到一个唯一的整数,但是每个整数都没有映射到一个唯一的字符串。有人可能会认为它是一种树状结构。

通过将此整数添加到表中,对其进行索引并使用类似以下的查询,有什么要获得的:

SELECT floatval FROM mytable WHERE phrase=givenstring AND assoc=givenint

这是Postgres,如果您不知道,我对数据库的经验很少。


阅读 199

收藏
2021-03-17

共1个答案

一尘不染

VARCHAR列上的键可能会很长,这会导致每页更少的记录和更多的深度(中的更多级别B-Tree)。较长的索引也会增加高速缓存未命中率。

平均有多少个字符串映射到每个整数?

如果相对较少,则只能在整数列上创建索引,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字节长,因此索引键将更短,同时仍几乎完美地保留了选择性。

2021-03-17