Python服务端面试—Mysql基础考点详解编程语言

Mysql基础考点

  • 事务的原理,特性,事务并发控制
  • 常用的字段、含义和区别
  • 常用数据库引擎之间区别

什么是事务?

Transaction

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

  例如:转账操作是事务使用的一个常见场景

示例:

session.begin() 
try: 
    item1 = session.query(Item).get(1) 
    item2 = session.query(Item).get(2) 
    item1.foo = 'bar' 
    item2.bar = 'foo' 
    session.commit() 
except: 
    sessin.rollback()  #commit失败后,回滚 
    raise

事务的ACID特性

ACID是事务的四个基本特性

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

事务的并发控制可能产生哪些问题?

如果不对事务进行并发控制,可能会产生四种异常情况

  • 幻读(phantom read):一个事务第二次查出现第一次没有的结果
  • 非重复读(nonrepeatable read):一个事务重复读两次得到不同结果
  • 脏读(dirty read):一个事务读取到另一个事务没有提交的修改
  • 丢失修改(lost update):并发写入造成其中的一些修改丢失

四种事务隔离级别

为了解决并发控制异常,定义了4种事务隔离级别

  • 读未提交(read uncommitted):别的事务可以读取到位提交改变
  • 读已提交(read committed):只能读取已经提交的数据
  • 可重复读(repeatable read):同一个事务先后查询结果一样(Mysql InnoDB默认实现可重复读级别)
  • 串行化(Serializable):事务完全串行化的执行,隔离级别最高,执行效率最低

如何解决高并发场景下的插入重复?

高并发的场景下,写入数据库会有数据重复问题

– 使用数据库的唯一索引

– 使用队列异步写入

– 使用redis等实现分布式锁

乐观锁和悲观锁

什么是乐观锁,什么是悲观锁?

– 悲观锁是先获取锁在进行操作,一锁二查三更新select for update

– 乐观锁先修改,更新的时候发现数据已经变了就回滚(check and set)

注意:乐观锁一般通过版本号或者时间戳实现

什么时候选择乐观锁和悲观锁呢?

答:需要根据响应速度,冲突频率,重试代价来判断使用哪一种

悲观锁是先获取锁,所以效率比较低

乐观锁冲突频率比较高

常用数据库引擎之间区别

InnoDB vs MyISAM

两种引擎常见的区别

– MyISAM不支持事务,InnoDB支持事务

– MyISAM不支持外键,InnoDB支持外键

– MyISAM只支持表锁,InnoDB支持行锁和表锁

什么时候创建索引?

建表的时候需要根据查询需求来创建索引

– 经常用做查询条件的字段(where条件)

– 经常用作表连接的字段

– 经常出现在order by, group by之后的字段

创建索引有哪些需要注意的?

最佳实践

– 非空字段NOT NULL, Mysql很难对空值作查询优化(建表规范-要求索引字段有默认值)

– 区分度高,离散度大,作为索引的字段值尽量不要有大量相同值

– 索引的长度不要太长(比较耗费时间)

索引什么时候失效?

记忆口诀:模糊匹配、类型隐转、最左匹配

– 以%开头的LIKE语句,模糊搜索

– 出现隐式类型转换(在Python这种动态语言查询中需要注意)

– 没有满足最左前缀原则(想想为什么是最左匹配?)

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/18178.html

(0)
上一篇 2021年7月19日 20:51
下一篇 2021年7月19日 20:51

相关推荐

发表回复

登录后才能评论