MYSQL,REDIS

MYSQL

mysql是一种关系型数据库,他是免费开源的,他将数据保存在不同的表中,而不是放在一个大仓库中,这样增加的查询速度和数据库的灵活性,而且支持多种系统操作

mysql和oracle的区别

  • mysql免费开源,oracle需要收费
  • mysql的安装包小,oracle的安装包比较大
  • mysql使用limit进行分页,第一个参数表示起始数,第二个参数表示每页条数,oracle使用伪列rownum进行分页,因为伪列只能用小于,不能用大于,所以要用一个两层的嵌套查询
  1. mysql的分页sql:select * from emp limit 1,4;
  2. oracle的分页sql:select * from (select rownum r,t.* from gcfr_t_vch t) tt where tt.r >= 3 and tt.r <= 4;
  • mysql的主键可以自增,oracle的主键只能使用序列

sql优化

我们使用了mysql自带的查询工具慢查询,慢查询就是用来发现查询超过指定时间的sql语句,通过慢查询,把这些sql语句记录到日志中,然后对这些sql进行优化

  • 避免全表扫描,在要查询的列上添加索引(添加索引是一个二次排序的过程,当然索引也不是越多越好,这样会导致新增和修改的效率降低,增加mysql的压力,删除不影响,一个表中的索引最多6个就行)
  • 避免对where子句中的字段进行非空判断,可以设置一个默认值
  • 避免对where子句的字段进行函数操作
  • 避免对where子句的字段进行不等于操作符
  • 避免对where子句中的字段进行表达式操作
  • 返回大量数据,用分页返回,按条数或者类型返回
  • 关键词能用EXITS就不用GROUP,能用GROUP就不用DISTINCT,用分组实现就别用去重,因为他的效率比较低

数据库锁:悲观锁和乐观锁

  • 悲观锁

假定发生并发冲突,屏蔽一切违法数据完整性的操作

实现:

//0.开始事务 begin;

//1.查询出商品库存信息 select quantity from items where id=1 for update;

//2.修改商品库存为2 update items set quantity=2 where id = 1;

//3.提交事务 commit;

通过for update加锁,然后再修改

如果以上修改库存的代码发生并发,同一时间只有一个线程可以开启事务并获得id=1的锁,其它的事务必须等本次事务提交之后才能执行。这样我们可以保证当前的数据不会被其它事务修改。

  • 乐观锁

假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性

实现:在表中加个version字段,在每次修改的时候,先查询获取版本号,在修改的时候将查询版本号作为参数,检查版本号,若参数版本号与表中的version字段值不一致,则无法进行修改,一般默认时间戳做版本号

MYSQL批处理:只针对更新(增,删,改)语句,默认是关闭的,开启时,需要在url中配置参数

jdbc:mysal://localhost:3306/mydb1?rewriteBatchedStatements=true

REDIS

redis是一种非关系型缓存数据库

redis为什么是单线程?
因为cpu不是redis的瓶颈,他的瓶颈可能是内存或者带宽

redis的数据类型:string,hash,set,zset,list

redis的持久化方式:

  • RDB:指定时间间隔把内存中的数据以快照的方式写入磁盘(默认开启)
  • AOF:以日志的形式记录服务器的每个写操作,redis重启的时候会读取该文件,重构数据库(appendonly yes来开启)

如何保证缓存和数据库数据一致

  • 设置缓存的过期时间
  • 更新数据库时同步redis,可以通过事务机制来保证数据的一致性
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值