MYSQL
mysql是一种关系型数据库,他是免费开源的,他将数据保存在不同的表中,而不是放在一个大仓库中,这样增加的查询速度和数据库的灵活性,而且支持多种系统操作
mysql和oracle的区别
- mysql免费开源,oracle需要收费
- mysql的安装包小,oracle的安装包比较大
- mysql使用limit进行分页,第一个参数表示起始数,第二个参数表示每页条数,oracle使用伪列rownum进行分页,因为伪列只能用小于,不能用大于,所以要用一个两层的嵌套查询
- mysql的分页sql:select * from emp limit 1,4;
- 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,可以通过事务机制来保证数据的一致性