【python面试指北】6.数据库

mysql

事务

  • 事务是数据库并发控制的基本单位
  • 事务可以看做是一系列SQL语句的集合
  • 事务必须要么全部执行成功,要么全部执行失败

ACID

  • 原子性(Atomicity): 一个事务中所有操作全部完成或失败
  • 一致性(Consistency): 事务开始和结束之后数据完整性没有被破坏
  • 隔离性(Isolation): 允许多个事务同时对数据库修改和读写
  • 持久性(Durability): 事务结束之后,修改是永久的不会丢失

乐观锁,悲观锁

  • 悲观锁是先获取锁再进行操做。一锁二查三更新。select for update
  • 乐观锁先修改,更新的时候发现数据已经变了就回滚。check and set
  • 使需要根据响应速度、冲突频率、重试代价来判断使用哪一种

musql常用类型

char/varchar/tinytext/text
tinyint/smallint/mediumint/int/sigint/float/double
date/datetime/timestamp

InnoDB vs MyISAM

  • MyISAM不支持事务,InnoDB支持事务
  • MyISAM不支持外键,InnoDB支持外键
  • MyISAM只支持表锁,InnoDB支持行锁和表锁

mysql索引

为什么需要索引

  • 索引是数据表中一个或者多个列进行排序的数据结构
  • 索引能够大幅提升检索速度
  • 创建、更新索引本身也会耗费空间和时间

B-树,B+树

连接

  • 内连接(inner join):两个表都存在匹配时,才会返回匹配行
  • 外连接(left join right join):返回一个表的行,即使另一个没有匹配
  • 全连接(full join): 只要某一个表存在匹配就返回

内连接

select * from A inner join B on a.id = b.id

外连接

select * from A left join B on a.id = b.id

redis

缓存

  • 缓解关系数据库(Mysql)并发访问的压力:热点数据
  • 减少响应时间:内存IO速度比磁盘快
  • 提升吞吐量:Redis等内存数据库单机就可以支撑很大并发

数据类型

  • string:用来实现简单的kv键值对存储,比如计数器
  • list:实现双向链表,比如用户的关注,粉丝列表
  • hash:用来存储彼此相关信息的键值对
  • set:存储不重复元素,比如用户的关注着
  • sorted set:实时信息排行榜

持久化方式

  • 快照方式:把数据快照放在磁盘二进制文件中,dump,.rdb
  • AOF:每一个写命令追加到appendonly.aof中

redis事务

  • 将多个请求打包,一次性、按序执行多个命令的机制
  • redis通过MULTI,EXEC,WATCH等命令实现事务功能
  • python redis-py pipeline=conn.pipeline(transaction=True)

分布式锁

  • 使用setnx实现加锁,可以同时通过expire添加超时时间
  • 锁的value值可以使用一个随机的uuid或者特定的命名
  • 释放锁的时候,通过uuid判断是否是该锁,是则执行释放锁

缓存使用模式

  • cache aside:同时更新缓存和数据库
  • read/write through:先更新缓存,缓存负责同步更新数据库
  • write behind caching:先更新缓存,缓存定期异步更新数据库

缓存穿透,缓存击穿,缓存雪崩

你可能感兴趣的:(【python面试指北】6.数据库)