什么是数据库?MySQL、MongoDB、Redis···

非关系型数据库与关系型数据库的应用

Posted by dzt on December 29, 2018

前言

由于公司准备对数据库优化方面做一点改动,所以叫我研究一下使用什么数据库对公司的业务更为方便、安全、性能更高。

所以,我在分析的过程中,顺带把这个过程记录下来。

Mysql

1、MySQL属于关系型数据库:

1.关系型数据库就是以行和列的形式去存储数据

2.表中的每一行叫一条数据记录;每一列叫做一个字段

3.表和表、表和字段、数据和数据存在着关系

例:

学院信息表,班级信息表,学生信息表,三者是具有逻辑关系的

优点:

  1. 数据之间有关系,进行数据的增删改查的时候是非常方便的
  2. 关系型数据库是有事务操作的,保证数据的完整性和一致性。
  3. 使用方便,都使用sql语句,sql语句非常常熟
  4. 数据的一致性高,冗余低,完整性好

缺点

  1. 因为数据和数据是有关系的,底层是运行了大量的算法大量算法会降低系统的效率,会降低性能
  2. 面对海量数据的增删改查的时候会显的无能为力
  3. 海量数据对数据进行维护变得非常的无力
  4. 固定的表结构,灵活度稍欠
  5. 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

适合处理一般量级的数据(银行转账和钱)

2、MongoDB和Redis都属于非关系型数据库:

1.非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对。

2.键值型数据库:Redis;文档型数据库:MongoDB

例:

# mongodb
{
 "_id":ObjectId("1831ojrqlwkaudyfao4u8"),
  "name":"dzt",
  "age":23
  }

优点

  1. 海量数据的增删改查是可以的

  2. 海量数据的维护和处理非常轻松
  3. 数据可以长期保存
  4. 弱化了数据结构,降低了数据的一致性

缺点

  1. 数据和数据没有关系,他们之间就是单独存在的

  2. 非关系数据库没有关系,没有强大的事务关系,没有保证数据的完整性和安全性
  3. 数据的查找修改不方便
  4. 数据的冗余性大

适合处理海量数据,保证效率,不一定安全(统计数据,例如微博数据)

2-1、Redis:

  1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,在set,hash等数据结构的存储。
  3. Redis支持数据的备份,即master-slave模式的数据备份
  4. 性能极高- Redis能读的速度是110000次/s,写的速度是81000次/s
  5. 丰富的数据类型-Redis支持二进制案例的Strings,Lists,Hashes,Setes及Ordered Sets数据类型操作。
  6. 原子 - Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  7. 丰富的特性 - Redis还支持publish/subscribe,通知,key过期等等特性。

2-2、MongoDB:

  1. 模式自由:可以把不同结构的文档存储在同一个数据库里
  2. 面向集合的存储:适合存储JSON风格文件的形式
  3. 完整的索引支持,对任何属性可索引
  4. 复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目的是提供冗余及自动故障转移
  5. 自动分片:支持水平的数据库集群,可动态添加额外的机器
  6. 丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式额标记,可轻易查询文档中的内嵌的对象及数组
  7. 快速就地更新:查询优化器会分析查询表达式,并生成一个高效的查询计划
  8. 高效的传统存储方式:支持二进制数据及大型对象

3、使用场景

MongoDB适用于

  1. 网站数据:适合实时的插入,更新与查询,并具备网站实时数据存储所需对的复制及高度伸缩性;
  2. 缓存:由于性能很高,也适合作为信息基础设施的缓存层,在系统重启之后,搭建的持久化缓存可以避免下层的数据源过载;
  3. 大尺寸、低价值的数据也是MongoDB的最佳选择,使用传统的关系数据库存储一些数据时可能会比较贵,再次之前很多程序员往往会选择传统的文件进行存储
  4. 高伸缩的场景,非常是个由数十或者数百台服务器组成的数据库
  5. 用于对象及json数据的存储,MongoDB的bson数据格式非常适合文档格式化的存储及查询。

而mysql还是更加适用于

  1. 高度事务性的系统。例如银行或者会计系统,传统的关系型数据库目前还是更实用于需要大量原子性复杂事务的应用程序
  2. 传统的商业智能应用,针对特定问题的BI数据库会对产生高度优化的查询方式,对于此类应用,数据仓库可能是更合适的选择

Redis应用场景:

  1. 用来做缓存-redis的所有数据时放在内存中的
  2. 可以在某些特定应用场景下替代传统数据库–比如社交类的应用
  3. 在一些大型系统中,巧妙的实现一些特定的功能:session共享、购物车

总结

MongoDB 的适用场景为:数据不是特别重要(例如通知,推送这些),数据表结构变化较为频繁,数据量特别大,数据的并发性特别高,数据结构比较特别(例如地图的位置坐标),这些情况下用 MongoDB , 其他情况就还是用 MySQL ,这样组合使用就可以达到最大的效率。

当网站的处理和访问量非常大的时候,我们的数据库的压力就变大了,一旦数据库承受了其最大承受能力,网站的数据处理效率就会大打折扣。此时就要使用高并发处理、负载均衡和分布式数据库,而这些技术既花费人力,又花费资金。

所以,可以使用redis作为缓存数据库。Redis其实就是说把表中经常访问的记录放在了Redis中,然后用户查询时先去查询Redis再去查询MySQL,确实实现了读写分离,也就是Redis只做读操作。由于缓存在内存中,所以查询会很快。