mysql /redis

三种数据库的区别

MongoDB

MongoDB是一个非关系型数据库

MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统

MongoDB将数据存储为一个文档,数据结构由key,value组成,MongoDB文档类似于Json独享,字段可以报班其他文档,数组及文档数组

MongoDB的数据之间事务关系支持比较弱

MongoDB在启动后会将数据库中的数据以未见映射的方式加载到内存中,如果内存资源相当丰富的话,这将极大地提高数据库的查询效率,

适合那些数据库具体数据格式不明确或者数据库格式经常变化的需求模型

Redis

非关系型数据库

他是内存数据库

Redis的key :字符串/字节数组

Redis的value:String,hash,list,set,zset,

MYsql

无论数据还是索引都存放在硬盘中,要使用的时候才交换到内存中

是一个关系型数据库

查询语句使用的是传统的sql语句,拥有较为成熟的体系

缺点就是海量数据处理的时候效率会显著变慢

当内存够用是redis>mongoDB>Mysql

mysql

数据库的三大范式

第一范式:列或者字段不能再分,要求属性具有原子性,不可再分解

第二范式:表中的列必须完全依赖于主键,非主键之间不能相互依赖

第三范式:数据不能存在传递关系,即每个属性都跟主键直接关系而不是间接关系

函数

count() 查询个数

max() 最大

min()最小

sum() 求和

avg()平均值

mysql的底层

mysql在5.1版本之后默认的innoDB存储引擎

innoDB的存在表锁和行锁,不过锁是在命中索引的情况下才会起作用默认的隔离级别为可重复读

innodb存储结构为b+树

innoDB的B+树存储的就是数据本身,因此也被恒威聚集索引,从实现数据可知使用innoDB存储引擎不宜采用过长的组件,否则由于叶子节点处直接存储数据原因,会赵成频繁的B+的分裂合并调整,效率十分低下,尽量采用自增进行存储,从数据结构实现看出,当读写频繁且一致性要求很高时采用innodb更假

mysql检查重复字段值是否重复

第一种分组查询

select 字段,count(*) from 表名  group by 字段  having count(*) >1

第二种关键字

select distinct 字段 from 表明

数据库的四大特性

原子性:事务是最小的执行单位,不允许分割,事务的原子性确保动作要么全部完成们要么全部失败

一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的

隔离性:并发访问数据库时.一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的

持久性:一个事务被提交后,他对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响

分库分表

垂直拆分的        

        优点:可以简化表结构利于维护

        缺点:主键会出现冗余,会让事务变得更加复杂

水平才分

        优点:保持数据结构不变可以达到分布式的目的

        缺点:给应用增加复杂度,通常查询时需要多个表名

Redis

redis的持久化机制

Redis 提供了两种持久化的方式,分别是 RDB(Redis DataBase)和 AOF(Append Only File)。RDB,简而言之,就是在不同的时间点,将 redis 存储的数据生成快照并存储到磁盘等介质上。AOF,则是换了一个角度来实现持久化,那就是将 redis 执行过的所有写指令记录下来,在下次 redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。RDB 和 AOF 两种方式也可以同时使用,在这种情况下,如果 redis 重启的话,则会优先采用 AOF方式来进行数据恢复,这是因为 AOF 方式的数据恢复完整度更高。

Redis的过期键的删除策略

过期策略通常有以下三种:

        定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
        惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
        定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
(expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。)
Redis中同时使用了惰性过期和定期过期两种过期策略。

缓存雪崩

解决方案

  1. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  2. 一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
  3. 给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。

redis的分布式策略

                        主从复制策略

通过执行slaveof命令或者设置slaveof选项让一个服务器区复制另一个服务器的数据,

主数据库可以进行读写操作,当写操作导致数据库发生变化时会自动将数据同步给从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据.

一个主数据库可以有多个从数据库而一个从数据库总是能有一个主数据库

当主数据库挂了不会影响读取,但不能写入

当从数据库挂了,可以在其他从数据库中进行读取

缺点就是当主数据库挂了则不在对外进行写入服务,不具备高可用性

                哨兵模式   Sentinel模式

哨兵模式是建立在主从模式的基础上,如果只有一个redis节点则扫兵模式就没有意义了

当主服务器挂了哨兵模式会在从服务器中选择一个作为主服务器,并修改他们的配置文件,当之前的主服务器重启后,他将不再是主服务器而是从服务器

因为哨兵也是一个进程也会有挂掉的可能,所以哨兵也会启动多个形成一个集群

                Cluster模式

当数据量过大到一台服务器存放不下的时候,哨兵模式就不能满足需求了,Cluster模式可以将数据分片分配到多台服务器上  只需要将redis的配置文件中的cluster-enable配置打开即可

mysql优化

1.硬件优化

提高cpu,可用空间大小,磁盘读写速度,网络带宽,

2.架构设计优化

mysql是一个io访问磁盘频繁的数据库, 搭建主从集群,读写分离,分库分表,针对热点数据引入redis缓存

3.sql执行优化

sql语句优化-----硬件优化--------表结构优化

语句优化

1.尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描

2.尽量避免使用in和not in,会导致全表扫描可以用between代替,

3.如果是子查询可以用exists代替

4.尽量避免使用or,会导致全表扫描,可以用union代替

5.尽量避免进行null值的判断,可以给字段添加默认值,对默认值判断

6.避免使用select *

表结构优化

1.使用可以存下数据的最小的数据类型

2.使用简单的数据类型,int 要比varchar类型在处理上简单

3.尽量使用not null定义字段

4.遵守建表的三大范式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值