MySQL、Redis、MongoDB常用数据库相关知识整理
事务的特性
1、原子性( Atomicity):
事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。
2、一致性( Consistency):
几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。
3、隔离性( Isolation):
事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
4、持久性( Durability):
对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障
Redis 和 MySQL 的区别
1、Redis 是内存数据库,数据保存在内存中,速度快。
2、MySQL 是关系型数据库,持久化存储,存放在磁盘里面,功能强大。检索的话,会涉及到一定的 IO,数据访问也就慢。
Redis避免攻击
1、主从
2、持久化存储
3、Redis 不以 root 账户启动
4、设置复杂密码
5、不允许 key 方式登录
数据库索引
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B_TREE。B_TREE 索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据;相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。
数据库怎么优化查询效率
1.储存引擎选择:如果数据表需要事务处理,应该考虑使用 InnoDB,因为它完全符合 ACID 特性。如果不需要事务处理,使用默认存储引擎 MyISAM 是比较明智的
2.分表分库,主从
3.对查询进行优化,要尽量避免全表扫描,首先应考虑在where 及 order by 涉及的列上建立索引
4.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
5.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描
6.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
7.Update 语句,如果只更改 1、2 个字段,不要 Update全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志
8.对于多张大数据量(这里几百条就算大了)的表 JOIN,要先分页再 JOIN,否则逻辑读会很高,性能很差。
数据库优化方案
- 优化索引、SQL 语句、分析慢查询;
- 设计表的时候严格根据数据库的设计范式来设计数据库;
- 使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘 IO;
- 优化硬件;采用 SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等;
- 采用 MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率;
- 垂直分表;把一些不经常读的数据放在一张表里,节约磁盘 I/O;
- 主从分离读写;采用主从复制把数据库的读操作和写入操作分离开来;
- 分库分表分机器(数据量特别大),主要的的原理就是数据路由;
- 选择合适的表引擎,参数上的优化;
- 进行架构级别的缓存,静态化和分布式;
- 不采用全文索引;
- 采用更快的存储方式,例如 NoSQL 存储经常访问的数据
Redis MongoDB 优缺点
MongoDB 和 Redis 都是 NoSQL,采用结构型数据存储。二者在使用场景中,存在一定的区别,这也主要由于二者在内存映射的处理过程,持久化的处理方法不同。MongoDB 建议集群部署,更多的考虑到集群方案,Redis 更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式.
Redis 优点:
1 读写性能优异
2 支持数据持久化,支持 AOF 和 RDB 两种持久化方式
3 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
4 数据结构丰富:除了支持 string 类型的 value 外还支持 string、hash、set、sortedset、list 等数据结构。
Redis缺点:
1 Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的 IP 才能恢复。
2 主机宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后还会引入数据不一致的问题,降低了系统的可用性。
3 Redis 的主从复制采用全量复制,复制过程中主机会 fork出一个子进程对内存做一份快照,并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内
存。若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入集群或者从机和主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一次全量的数据复制,这对实际的系统运营造成了不小的麻烦。
4 Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
Redis优点:
a.弱一致性(最终一致),更能保证用户的访问速度
b.文档结构的存储方式,能够更便捷的获取数据
c.内置 GridFS,高效存储二进制大对象 (比如照片和视频)
d.支持复制集、主备、互为主备、自动分片等特性
e.动态查询
f.全索引支持,扩展到内部对象和内嵌数组
Redis缺点:不支持事务
MongoDB缺点:
占用空间过大
维护工具不够成熟
Mysql 集群
1、Mysql 群集(Cluster)简介
MySQL 群集需要有一组计算机,每台计算机的角色可能是不一样的。MySQL 群集中有三种节点:管理节点、数据节点和SQL 节点。群集中的某计算机可能是某一种节点,也可能是两种或三种节点的集合。这三种节点只是在逻辑上的划分,所以它们不一定和物理计算机是一一对应的关系。
2、管理节点(也可以称管理服务器)主要负责管理数据节点和 SQL 节点,还有群集配置文件和群集日志文件。它监控其他节点的工作状态,能够启动、关闭或重启某个节点。其他节点从管理节点检索配置数据,当数据节点有新事件时就把事件信息发送给管理节点并写入群集日志。
3、数据节点用于存储数据。
SQL 节点跟一般的 MySQL 服务器是一样的,我们可以通过它进行 SQL 操作。
MysqlServer 已经不能满足群集的要求,配置群集需要使用 MySQLCluster。
怎样解决海量数据的存储和访问造成系统设计瓶颈的问题
1、水平切分数据库:可以降低单台机器的负载,同时最大限度的降低了宕机造成的损失;分库降低了单点机器的负载;分表,提高了数据操作的效率,负载均衡策略:可以降低单台机器的访问负载,降低宕机的可能性;
2、集群方案:解决了数据库宕机带来的单点数据库不能访问的问题;
3、读写分离策略:最大限度了提高了应用中读取数据的速度和并发量;
MySQL 集群的优缺点
优点:
a) 99.999%的高可用性
b)快速的自动失效切换
c)灵活的分布式体系结构,没有单点故障
d)高吞吐量和低延迟
e)可扩展性强,支持在线扩容
缺点:
a)存在很多限制,比如:不支持外键
b)部署、管理、配置很复杂
c)占用磁盘空间大,内存大
d)备份和恢复不方便
e)重启的时候,数据节点将数据 load 到内存需要很长时间
MySQL引擎区别
主要 MyISAM 与 InnoDB 两个引擎,其主要区别如下:
一、InnoDB 支持事务,MyISAM 不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而 MyISAM就不可以了;
二、MyISAM 适合查询以及插入为主的应用,InnoDB 适合频繁修改以及涉及到安全性较高的应用;
三、InnoDB 支持外键,MyISAM 不支持;
四、MyISAM 是默认引擎,InnoDB 需要指定;
五、InnoDB 不支持 FULLTEXT 类型的索引;
六、InnoDB 中不保存表的行数,如 select count() from table 时,InnoDB;需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。注意的是,当 count()语句包含 where 条件时MyISAM 也需要扫描整个表;
七、对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM表中可以和其他字段一起建立联合索引;
八、清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表;
九、InnoDB 支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’
Redis 基本类型、相关方法
Redis支持五种数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)及zset(sorted set:有序集合)。
一、String
String是Redis最为常用的一种数据类型,String的数据结构为key/value类型,String可以包含任何数据。
常用命令: set,get,decr,incr,mget 等
二、Hash
Hash类型可以看成是一个key/value都是String的Map容器。
常用命令:hget,hset,hgetall 等。
三、List
List用于存储一个有序的字符串列表,常用的操作是向队列两端添加元素或者获得列表的某一片段。
常用命令:lpush,rpush,lpop,rpop,lrange等
四、Set
Set 可以理解为一组无序的字符集合,Set 中相同的元素是不会重复出现的,相同的元素只保留一个。
常用命令:sadd,spop,smembers,sunion等
五、Sorted Set(有序集合)
有序集合是在集合的基础上为每一个元素关联一个分数,Redis通过分数为集合中的成员进行排序。
常用命令:zadd,zrange,zrem,zcard 等
redis 的事务
Redis 事务允许一组命令在单一步骤中执行。事务有两个属性,说明如下:
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。
事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis 事务是原子的。原子意味着要么所有的命令都执行,要么都不执行;
一个事务从开始到执行会经历以下三个阶段:
1、开始事务
2、命令入队
3、执行事务
Redis 的使用场景
1.取最新 N 个数据的操作
2.排行榜应用,取 TOP N 操作
3.需要精准设定过期时间的应用
4.计数器应用
5.uniq 操作,获取某段时间所有数据排重值
6.Pub/Sub 构建实时消息系统
7.构建队列系统
8.缓存
Redis 默认端口,默认过期时间,Value 数据长度
1、默认端口:6379
2、默认过期时间:可以说永不过期,一般情况下,当配置中开启了超出最大内存限制就写磁盘的话,那么没有设置过期时间的 key 可能会被写到磁盘上。假如没设置,那么REDIS 将使用 LRU 机制,将内存中的老数据删除,并写入新数据。
3、Value 最多可以容纳的数据长度是:512M。
怎样解决数据库高并发的问题
解决数据库高并发:
- 分表分库
- 数据库索引
- Redis 缓存数据库
- 读写分离
- 负载均衡集群:将大量的并发请求分担到多个处理节点。由于单个处理节点的故障不影响整个服务,负载均衡集群同时也实现了高可用性。
sqlserver,MySQL ,Oracle http,Redis,https,ssh默认端口号
sqlserver:1433
MySQL :3306
Oracle :1521
http: 80
https :443
Redis:6379
ssh: 22
Redis 缓存命中率计算
Redis 提供了 INFO 这个命令,能够随时监控服务器的状态,只用 telnet 到对应服务器的端口,执行命令即可:1
2telnet localhost 6379
info
在输出的信息里面有这几项和缓存的状态比较有关系:1
2
3
4
5keyspace_hits:14414110
1. keyspace_misses:3228654
2. used_memory:433264648
3. expired_keys:1333536
4. evicted_keys:1547380
通过计算 hits 和 miss,我们可以得到缓存的命中率:14414110 / (14414110 + 3228654)= 81% ,一个缓存失效机制和过期时间设计良好的系统,命中率可以做到 95%以上
Redis 有多少个库
Redis默认由16个库(0~15号). 且默认使用的是0号库.
如果要切换库则使用:1
select number # number表示几号库.
MongoDB
1、MongoDB 是一个面向文档的数据库系统。使用 C++编写,不支持 SQL,但有自己功能强大的查询语法。
2、MongoDB 使用 BSON 作为数据存储和传输的格式。BSON 是一种类似 JSON 的二进制序列化文档,支持嵌套对象和数组。
3、MongoDB 很像 MySQL,document 对应 MySQL 的 row,collection 对应 MySQL 的 table
应用场景:
1.网站数据:MongoDB 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
2.缓存:由于性能很高,MongoDB 也适合作为信息基础设施的缓存层。在系统重启之后,由MongoDB 搭建的持久化缓存可以避免下层的数据源过载。
3.大尺寸、低价值的数据:使用传统的关系数据库存储一些数据时可能会比较贵,在此之前,很多程序员往往会选择传统的文件进行存储。
4.高伸缩性的场景:MongoDB非常适合由数十或者数百台服务器组成的数据库。
5.用于对象及 JSON 数据的存储:MongoDB 的 BSON 数据格式非常适合文档格式化的存储及查询。
6.重要数据:MySQL,一般数据:MongoDB,临时数据:memcache
7.对于关系数据表而言,MongoDB 是提供了一个更快速的视图 view;而对于 PHP 程序而言,MongoDB 可以作为一个持久化的数组来使用,并且这个持久化的数组还可以支持排序、条件、限制等功能。
8.将 MongoDB 代替MySQL 的部分功能,主要一个思考点就是:把 MongoDB 当作 MySQL 的一个 view(视图),view 是将表数据整合成业务数据的关键。比如说对原始数据进行报表, 那么就要先把原始数据统计后生成 view,在对 view 进行查询和报表。
不适合的场景:
a.高度事物性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
b.传统的商业智能应用:针对特定问题的 BI 数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
c.需要 SQL 的问题
d.重要数据,关系数据
优点:
a.弱一致性(最终一致),更能保证用户的访问速度
b.文档结构的存储方式,能够更便捷的获取数据
c.内置 GridFS,高效存储二进制大对象 (比如照片和视频)
d.支持复制集、主备、互为主备、自动分片等特性
e.动态查询
f.全索引支持,扩展到内部对象和内嵌数组
Redis缺点:
a.不支持事务
b.MongoDB 占用空间过大
c.维护工具不够成熟
说一下 MySQL 数据库存储的原理
1、储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有 SQL 语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。
2、存储过程通常有以下优点:
1)存储过程能实现较快的执行速度。
2)存储过程允许标准组件是编程。
3)存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
4)存储过程可被作为一种安全机制来充分利用。
5)存储过程能过减少网络流量。
Mysql 和 Redis 高可用性
1、MySQL Replication 是 MySQL 官方提供的主从同步方案,用于将一个 MySQL 实例的数据,同步到另一个实例中。Replication 为保证数据安全做了重要的保证,也是现在运用最广的 MySQL 容灾方案。Replication 用两个或以上的实例搭建了 MySQL 主从复制集群,提供单点写入,多点读取的服务,实现了读的 scale out.
2、Sentinel 是 Redis 官方为集群提供的高可用解决方案。 在实际项目中可以使用 sentinel 去做 Redis 自动故障转移,减少人工介入的工作量。另外 sentinel 也给客户端提供了监控消息的通知,这样客户端就可根据消息类型去判断服务器的状态,去做对应的适配操作。
3、下面是 Sentinel 主要功能列表:
(1)Monitoring:Sentinel 持续检查集群中的 master、slave状态,判断是否存活。
(2)Notification:在发现某个 redis 实例死的情况下,Sentinel 能通过 API 通知系统管理员或其他程序脚本。
(3)Automatic failover:如果一个 master 挂掉后,sentinel立马启动故障转移,把某个 slave 提升为 master。其他的 slave重新配置指向新 master。
(4)Configuration provider:对于客户端来说 sentinel 通知是有效可信赖的。客户端会连接 sentinel 去请求当前 master 的地址,一旦发生故障 sentinel 会提供新地址给客户端。
数据库负载均衡
负载均衡集群是由一组相互独立的计算机系统构成,通过常规网络或专用网络进行连接,由路由器衔接在一起,各节点相互协作、共同负载、均衡压力,对客户端来说,整个群集可以视为一台具有超高性能的独立服务器。
1、实现原理
实现数据库的负载均衡技术,首先要有一个可以控制连接数据库的控制端。在这里,它截断了数据库和程序的直接连接,由所有的程序来访问这个中间层,然后再由中间层来访问数据库。这样,我们就可以具体控制访问某个数据库了,然后还可以根据数据库的当前负载采取有效的均衡策略,来调整每次连接到哪个数据库。
2、实现多数据库数据同步
a.对于负载均衡,最重要的就是所有服务器的数据都是实时同步的。这是一个集群所必需的,因为,如果数不据实时、不同步,那么用户从一台服务器读出的数据,就有别于从另一台服务器读出的数据,这是不能允许的。所以必须实现数据库的数据同步。这样,在查询的时候就可以有多个资源,实现均衡。
b.比较常用的方法是 Moebius for SQL Server 集群,Moebius for SQL Server 集群采用将核心程序驻留在每个机器的数据库中的办法,这个核心程序称为 Moebius for SQL Server 中间件,主要作用是监测数据库内数据的变化并将变化的数据同步到其他数据库中。
c.数据同步完成后客户端才会得到响应,同步过程是并发完成的,所以同步到多个数据库和同步到一个数据库的时间基本相等;另外同步的过程是在事务的环境下完成的,保证了多份数据在任何时刻数据的一致性。
d.正因为 Moebius 中间件宿主在数据库中的创新,让中间件不但能知道数据的变化,而且知道引起数据变化的 SQL 语句,根据 SQL 语句的类型智能的采取不同的数据同步的策略以保证数据同步成本的最小化。
e.数据条数很少,数据内容也不大,则直接同步数据数据条数很少,但是里面包含大数据类型,比如文本,二进制数据等,则先对数据进行压缩然后再同步,从而减少网络带宽的占用和传输所用的时间。
f.数据条数很多,此时中间件会拿到造成数据变化的 SQL 语句, 然后对 SQL 语句进行解析,分析其执行计划和执行成本,并选择是同步数据还是同步 SQL 语句到其他的数据库中。此种情况应用在对表结构进行调整或者批量更改数据的时候非常有用。
3、优缺点
优点:
(1) 扩展性强:当系统需要更高数据库处理速度时,只要简单地增加数据库服务器就 可以得到扩展。
(2) 可维护性:当某节点发生故障时,系统会自动检测故障并转移故障节点的应用,保证数据库的持续工作。
(3) 安全性:因为数据会同步的多台服务器上,可以实现数据集的冗余,通过多份数据来保证安全性。另外它成功地将数据库放到了内网之中,更好地保护了数据库的安全性。
(4) 易用性:对应用来说完全透明,集群暴露出来的就是一个 IP
缺点:
(1) 不能够按照 Web 服务器的处理能力分配负载。
(2) 负载均衡器(控制端)故障,会导致整个数据库系统瘫痪。