sql和nosql的本质,从数据库设计角度看

以mysql为关系库的例子.redis,hbase为nosql例子
数据库查询瓶颈来自:全表扫描,随机io,关系数据库性能提升主要围绕如何利用索引,存储优化来改善查询
查询和更新的性能往往是对立的.
mysql通过索引可以增加特定查询的性能.索引实质是建立一张索引表.存储上在一个页内按索引顺序存储(没页大小可以指定到64k),但是不保证页间的存储连续性.
hbase一个表只支持一个主键索引,所以也需要新建表来实现查询优化.但是hbase的存储是整个hfile内按主键连续(大小可达G级别).
这样看,hbase建多个表和mysql建一个表多个索引,两者其实殊途同归.另外mysql虽然只是业内顺序存储,但是大多的查询其实都在一页或两页内解决了.整体上看并不吃亏.
另外hbase不支持多表甚至单表的多行事务.mysql是全套支持的.
从更新上来看hbase通过sstable结构,更新速度非常快,应该是优于mysql,但是实时的查询上是吃亏的(因为还未来得及合并,会从多个地方合并数据)
这里再说说redis的有序集合,其对应mysql的b-tree索引.redis采用跳表实现有序集合.
无序集合则对应到hash索引.
场景:实时查询(更新后立刻查询)场景,hbase损耗较多.
需要事务的场景使用mysql解决.
hbase更适合需要高速更新和不太慢的查询场景.
mysql则是通过牺牲更新速度来提升查询性能.
另外mysql事务是包括索引的.太多索引会进一步减慢数据更新的速度.更新通常会锁一定的资源从而影响到查询操作.
redis的数据都放在内存中,mysql的索引也可以全部放入内存,这种情况下,mysql可以实现redis的数据库设计.

posted @ 2018-05-07 16:22  java林森  阅读(172)  评论(0编辑  收藏  举报