面试必问【数据库】——mysql索引,锁,数据库事务,sql调优,redis

页的大小为什么是4K?

cpu一次能处理数据宽度,总线大小是4k

索引数据结构,为什么用这个结构

B+树
1、B+树是多路平衡搜索树,树高是平衡的,多次搜索的效率平均,搜索时间短
2、B+树的多路特性,可以让数据库存储引擎能够多获取一页数据,提高查询的效率和命中率

聚簇索引和非聚簇索引

myaism非聚簇索引,数据和索引分文件存储,速度慢主键索引树和辅助索引树的叶子节点都存储的是指向数据页的指针。走两个树都能够查到数据

innodb聚簇索引,数据和索引存在一个文件,数据行存在主键索引树的叶子节点,辅助索引的叶子节点存主键索引的指针。如果走的是辅助索引树,需要回表才能查到数据

所以myaism适合频繁更新的数据

mysql的执行计划 explain + SQL语句

type:system>const>eq_ref>ref>range>index>ALL

【1】system:表只有一行记录(系统表),平时不会出现;
【2】const:表示通过索引一次就能找到,const用于比较 primary和 unique索引
cows
【3】eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常用于主键或唯一索引扫描。eg:CEO部门;
【4】ref:非唯一性索引扫描,返回匹配某个单独值的所有行;
【5】rang:只检索给定范围的行,使用一个索引来选择行。一般where语句中出现between、<、>、in等的查询。这种范围扫描索引比全表扫描要好,因为只需开始索引的某一点,而结束另一点,不用扫描全部索引;
【6】index:Full Index Scan,index与 ALL区别为 index类型只遍历索引树,索引文件通常比数据文件小。index从索引中读取,而All是从硬盘读取;
【7】ALL:从磁盘中读取

extra:

【7】Using index condition:是否索引下推

索引下推index condition pushdown

将一部分判断条件传递给存储引擎
引擎而是依据查询条件,过滤结果页给到数据库的服务器
减少查表次数,减少数据读取,提高查询效率

如何做慢 SQL 优化?

1.创建索引:创建合适的索引,我们就可以在索引中查询,查询到以后直接找对应的额记录
2,分表:当一张表的数据比较多或者一张表的某些字段的值比较多并且很少使用时,采用水平分表或垂直分表来优化,比如spu表
3,读写分离:当一台服务器不能满足需要时,采用将读写分离的方式进行集群,一台机器写,其他机器读
4.缓存:使用redis来进行缓存

mysql索引失效的情况

or,like,函数转换,数值没有按照类型,比如int类型加了引号。
至于in是否会索引失效,可能是mysql版本的问题,或者是可能因为字段类型转换的问题

分页函数limit

mysql用limit分页,oracle用rownum分页
table LIMIT 5 , 10 ; // 检索记录行 6 - 15
LIMIT 95 , - 1 ; // 检索记录行 96 - last.//从96到最大
LIMIT 5 ; // 检索前 5 个记录行
第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目

扫描二维码关注公众号,回复: 12510201 查看本文章

事务的特性

原子性,对数据的操作要么全部失败,要么全部成功
一致性:事务开始和完成,数据保持一致
隔离性:事务之间相互独立,中间状态不对外可见
持久性:数据修改是永久的

数据库事务隔离级别

4个隔离级别
1、读未提交
事务B可以读到事务A未提交的数据,破坏了隔离性,一旦事务A回滚,事务B读到的就是脏数据
2、读提交
一个事务只会查询到其他事务已提交的数据,但是事务会读到已提交数据,会造成这个事务重复读数据时数据改变,不可重复读 破坏了一致性(update和delete)
A事务更新或者删除数据,提交后,B事务第一次查询和第二次查询数据不一致,也就是不可重复读
3、可重复读
a事务对自己未存在的数据多次读取,第一次不存在,第二次存在,是一致性(insert)
例子,事务A查询数据是7条,事务Binsert一条变成8条,提交。因为加的是行锁,不是表锁,然后A 事务更新表某个字段的所有值发现更新了8条数据,A事务幻读
4、串行化

innoDB事务隔离级别的实现

锁机制:
ru:事务读取的时候不加锁
rc:读到的时候才加行级共享锁,读完立即释放,并不是事务结束
rr:入去时加行级共享锁,锁事务结束后释放
se:加表级共享锁,事务结束才释放

MVCC多版本并发控制

生成一个数据快照
实际就是CAS版本控制和读写分离,主要作用域rc和rr级别

表锁粒度和执行效率

表锁的粒度最大,执行效率低

表共享锁和表排他锁区别

表读取时加的锁,允许其他事务读取,不允许写,是共享的
表写时加的锁,不允许读写

行锁

行锁粒度低,冲突小,不容易死锁

innodb默认行锁,myasim没有行锁概念,这是两者区别之一

innodb的行锁和表锁具体的实现和区别

innodb在走索引的时候用行锁,此时锁住的是索引列而不是所有数据
全局查询用表锁,锁

InnoDB间隙锁

当我们使用范围条件查询而不是等值条件查询的时候,InnoDB就会给符合条件的范围索引加锁,在条件范围内并不存的记录就叫做"间隙(GAP)"

Innodb和myasim死锁

innodb会死锁
myasim不会死锁,因为加的是表锁,是串行化的。
但是innodb并发效率也就高

分布式自增长主键

1、用自增长序列,可以指定起止和步长
2、uuid
3、雪花算法

Redis
项目中使用的 Redis 版本

Redis 在项目中的使用场景

Redis 怎么保证高可用

Redis 的选举流程

Redis 和 Memcache 的区别

Redis 的集群模式

Redis 集群要增加分片,槽的迁移怎么保证无损

Redis 分布式锁的实现

Redis 删除过期键的策略

Redis 的内存淘汰策略

Redis 的 Hash 对象底层结构

Redis 中 Hash 对象的扩容流程

Redis 的 Hash 对象的扩容流程在数据量大的时候会有什么问题吗

Redis 的持久化机制有哪几种

RDB 和 AOF 的实现原理、优缺点

AOF 重写的过程

哨兵模式的原理

使用缓存时,先操作数据库还是先操作缓存

为什么是让缓存失效,而不是更新缓存

缓存穿透、缓存击穿、缓存雪崩

更新缓存的几种设计模式

猜你喜欢

转载自blog.csdn.net/u010010600/article/details/109203044