在日常开发中,我们在使用某个NoSQL产品时往往看到的大多是它的优点,但可能会忽略其隐性的问题或陷阱。请各位使用NoSQL朋友,分享下您在使用NoSQL过程中遇到的问题或一些陷阱。

2010-11-06 00:59:22

2 Answers

由于NoSQL相对于SQL来说,往往技术较新,文档也相对有所欠缺,所以我们在使用NoSQL时会,经常会犯一次错误: 1、使用循环来获取数据,而忽略使用系统自带的批量GET工具; 如使用循环获取memcached数据:


Map<String,String>result=new HashMap<String,String>(); for(int i=0,len=keys.length;i<len;i++){ result.put(keys[i],memcacheGet(keys[i])); }


这段执行耗时10ms 而如果使用批量获取命令:

Map<String, Object> objMap = client.get(Arrays.asList(keys));

这段代码执行只耗时2ms

在Redis等NoSQL中也有类似的命令可以大幅提高我们程序的效率


2.忽略对数据的压缩;

对数据进行压缩再存入NoSQL系统中也是我们容易忽视的地方,数据经压缩后再存储,可以减小存储,提升IO性能,并且能够提升网络IO性能,不过在使用压缩技术时,要注意使用各语言通用的压缩算法,以确保经压缩的数据能够被另外一中语言的客户端所使用


3.官方一些宣传陷阱;

大部分NoSQL产品,在其官方数据中往往都是一些很高的性能,很少有提及缺点的,但其实在实际应用中,表现得并不是那么美好。如Tokyo Cabinet 的官方数据中,具有很高的读写性能,但实际测试中你会发现,数据增加后,速度会骤减。另外Redis做持久存储时,也会遇到单点、复制问题,数据超过内存性能急剧下降,以及扩容问题等。


4.其他陷阱

另外像我们日常中遇到的文档匮乏、细节描述不清楚、版本升级带来兼容问题等,都是一些常见的陷阱

2010-11-06 02:44:56

1.不支持SQL,不支持事务,产品不够成熟(相比Oracle、SQL Server、MySQL)。
2.最大的陷阱在于NoSQL的hash存储结构的制约,当数据巨增时hash每个桶内会有很多元素。若使用拉链法,这些一个桶内的元素不得不使用链表链接起来。造成映射时,还得去桶内查找元素。这个是未来NoSQL发展的瓶颈所在。
3.对于点查询自然NoSQL快,因为直接映射。而对于范围查询,是可以对关系数据库建立B+树索引的,NoSQL的hash存储结构未必有优势。

2010-11-06 04:51:36
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作