注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

Hash 索引创建奇慢  

2011-02-24 17:09:24|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

     今天学习了下 Hash 索引,在了解HASH索引的应用场合后,打算实践一下,但在创建过程中
奇慢,有个测试表才 1.5G 大,在创建了两小时候还没结束,而且系统上也没有锁。于是猜测HASH
索引创建应该比 btree 索引创建慢得多,下面是做的一些测试,用来比较不同数据量环境下创建
btree索引和 HASH 索引的速度。

--机器配置
8 CPU 8G 内存  
OS  Red Hat Enterprise Linux Server release 5.5

场景一: 创建表a, 插入 1000条数据,
skytf=> create table test_a (id integer,name varchar(32));
CREATE TABLE

skytf=> insert into test_a select generate_series(1,1000),'francs';
INSERT 0 1000

skytf=> create index idx_btree_test_a_name on test_a using btree (name);
CREATE INDEX
Time: 35.931 ms

skytf=> create index idx_hash_test_a_name on test_a using hash (name);
CREATE INDEX
Time: 2.578 ms

  在 1000条数据下,创建 btree索引花了 35.9 ms , 创建 hash索引花了2.6ms
 
 
场景二:创建表 test_b, 插入 1万条记录
skytf=>  create table test_b (id integer,name varchar(32));
CREATE TABLE

skytf=>  insert into test_a select generate_series(1,10000),'francs';
INSERT 0 10000

skytf=> create index idx_btree_test_b_name on test_b using btree (name);
CREATE INDEX
Time: 56.990 ms

skytf=>  create index idx_hash_test_b_name on test_b using hash (name);
CREATE INDEX
Time: 56.261 ms

  在 1万 条数据下,创建 btree索引花了 56.9ms , 创建 hash索引花了 56.2 ms  
 
场景三:创建表 test_c, 插入 10 万条记录
skytf=> create table test_c (id integer,name varchar(32));
CREATE TABLE

skytf=>  insert into test_a select generate_series(1,100000),'francs';
INSERT 0 100000

skytf=>  create index idx_btree_test_c_name on test_c using btree (name);
CREATE INDEX
Time: 181.033 ms

skytf=>  create index idx_hash_test_c_name on test_c using hash (name);
CREATE INDEX
Time: 4643.801 ms

  在 10万 条数据下,创建 btree索引花了 181.0 ms , 创建 hash索引花了 4643 ms
 
场景四:创建表 test_d, 插入 100万 条记录
skytf=> create table test_d (id integer,name varchar(32));
CREATE TABLE

skytf=> insert into test_d select generate_series(1,1000000),'francs';
INSERT 0 1000000

skytf=> create index idx_btree_test_d_name on test_d using btree (name);
CREATE INDEX
Time: 1909.001 ms

skytf=> create index idx_hash_test_d_name on test_d using hash (name);
CREATE INDEX
Time: 591817.814 ms

      在 100万 条数据下,创建 btree索引花了 1909.0 ms , 创建 hash索引花了 591817 ms
在这种情况下,创建HASH索引明显很慢,创建HASH索引的时间是创建btree 索引的近 31倍。

四种场景时间统计

表名 记录数 创建btree花的时间(ms) 创建btree花的时间(ms)
table_a 1000 35.9 2.6
table_b 1万 56.9 56.2
table_c 10万 181 4643
table_d 100万 1909 591817

 

 总结: 1  因为 hash 索引创建消耗的时间很长,可以预计当表达到 1G 以上,创建 HASH 索引
             将会变得非常艰难,保守估计,创建 hash 索引花费的时间至少是 创建btree 所花费
             的时间  20 倍以上。
      
           2  尽管 Hash 索引适用于特定场合,但创建很慢,推测创建 HASH索引后,此索引维护
               代价(指删入操作)非常大,所以不建议使用到生产库中。 


            3  至于在特定场合 Hash 索引是否比 btree 索引高效,还有侍验证。

  评论这张
 
阅读(26697)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016