ale*_*lex 14 sql postgresql indexing performance
我有一个表的列varchar(50)和a float.我需要(很快)看看与给定字符串相关联的浮点数.即使使用索引,这也相当慢.
但是,我知道每个字符串都与一个整数相关联,我在查找时就已知道,因此每个字符串都映射到一个唯一的整数,但每个整数都不会映射到唯一的字符串.人们可能会认为它是一种树状结构.
是否可以通过向表中添加此整数,对其进行索引以及使用如下查询来获取任何内容:
SELECT floatval FROM mytable WHERE phrase=givenstring AND assoc=givenint
这是Postgres,如果你说不清楚,我对数据库的经验很少.
Qua*_*noi 18
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字节长,因此索引键将更短,同时仍然保持选择性几乎完美.
我只推荐一个哈希索引:
create index mytable_phrase_idx on mytable using hash(phrase);
这样查询像
select floatval from mytable where phrase='foo bar';
会很快。测试一下:
create temporary table test ( k varchar(50), v float);
insert into test (k, v) select 'foo bar number '||generate_series(1,1000000), 1;
create index test_k_idx on test using hash (k);
analyze test;
explain analyze select v from test where k='foo bar number 634652';
查询计划 -------------------------------------------------- -------------------------------------------------- ------------- 在测试上使用test_k_idx进行索引扫描(成本= 0.00..8.45行= 1宽度= 8)(实际时间= 0.201..0.206行= 1循环= 1) 索引条件:((k):: text ='foo bar number 634652':: text) 总运行时间:0.265毫秒 (3列)
| 归档时间: | 
 | 
| 查看次数: | 17499 次 | 
| 最近记录: |