Mysql面试题总结

一. Mysql两种引擎的区别
InnoDB
  1. 支持行锁和表锁,默认为行锁
    行锁:在更新数据时锁住某条数据,性能差,并发效率高
    表锁:在更新数据时锁住整个表,性能好,并发效率低
  2. 支持acid的事务操作,支持事务的四种隔离级别
  3. 聚集索引,索引文件,主索引key存储主键值,value存储其它数据;辅索引key存储索引的值,value存储主键,使用索引查询数据时涉及到回表操作
  4. select count(*)会触发全表扫描操作
MyIASM
  1. 只支持表锁,写请求优先于读请求锁表
  2. 不支持事务
  3. 非聚集索引,索引存储数据区域使用指针存储, 指针指向真实数据。存储文件分为三部分:表结构文件、索引文件、数据文件
  4. 会在其它地方维护一个count(*)的数据,在有不带where语句的count查询时会直接返回该计数,带where语句需要扫描表
二. 事务隔离级别
  1. 读未提交:隔离级别低。在读数据时会读取到其它线程事务未提交前修改的数据,会造成脏读、幻读、不可重复读
  2. 读提交:隔离级别中。在读数据时不会读取到其它线程事务未提交前修改的数据,在其它事务提交事务成功后,才可读取到最新的数据,会造成幻读,不可重复读
  3. 可重复读:事务A一旦开启事务,无论其它事务如何改数据,事务A都会读取到他一开始读到的数据
  4. 串行化:隔离级别高,代价高,可靠。每有事务操作都会将数据上锁,读取时会阻塞,直到事务关闭。
名词解释:

脏读:表示一个事务能读取到另一个事务未提交的数据,当其它事务回滚后,会造成之前幻读后的数据与真实数据不统一的问题
幻读:同一个事务内多次查询同一批数据返回结果集不一样。事务A第一次查询有N条数据,事务B在数据中插入/删除了一条,事务A第二次同等条件查询就有N+1/N-1条数据,就好像产生了幻觉
不可重复读:在同一事务内,多次读取同样的数据,返回结果不一样.事务A多次读取数据的过程中,被事务B修改了

三. 简单的性能优化
  1. 为搜索的字段创建合适的索引
  2. 避免使用select * ,列出需要查询的字段
  3. 选择正确的存储引擎
  4. 避免查询时where条件使用!=
四. 乐观锁与悲观锁
  1. 乐观锁:每次都会认为别人不会修改数据,只有在提交数据时才会判断此期间别人有没有修改过数据,如果修改过,则返回错误。
  2. 悲观锁:每次都认为别人会修改数据,所以在拿数据的时候会给数据上锁,在结束时释放,这样别人就不会修改数据。for update语句

乐观锁需要自行实现,在表中加一个version字段,每次修改成功后数据+1,这样每次修改都会对比数据库中的version字段值是否一致,如果不一致就不修改

五. 索引相关知识点

主键索引:(K,V)K为主键id,V为剩下的所有数据
普通索引:(K,V)K为索引字段值,V为对应的主键id。
覆盖索引:select的结果集可以直接在普通索引上找到,不需要回表。
最左前缀原则:假设表中有字段A和字段B,建立的普通索引为A+B。在查询条件为A =’’ AND B=’’ 或者 A=’’ 或者B =’’ AND A=’’ (优化器会优化sql)都会使用索引查询,只有在查询条件为B=’'时不会走索引,所以在涉及索引时应该考虑该业务场景查询的关键字段
索引下推:在索引的查询过程中过滤条一些不符合条件的数据,减少回表次数。
例如用户表id,name,age,根据name+age的规则建立了普通索引。在执行select * from t_user where name like ‘张%’ and age= 10 这条sql时,使用索引查询,指针到了张某的第一条数据位置时,mysql会直接判断该条记录的age=10,如果不等于则进去往下遍历,减少了回表次数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值