MySQL
死锁
两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
产生死锁的四个必要条件:
- 互斥条件:一个资源每次只能被一个进程使用。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
死锁产生影响
当产生某表死锁的一开始,所有涉及这张表的操作都将受到阻塞。假设这张表在业务逻辑上是读写频繁的,那就会使很多操作在那里排队等待,而排队等待会占用数据库连接,当该达到该数据库连接数的最大承载数之后,就会使所有数据库操作均无法再继续下去,致使数据库各项指标异常,导致整个环境崩溃。
如何发现死锁
SHOW FULL PROCESSLIST;
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
如何处理死锁:通过以上方法一可以查询对应死锁的数据库进程,可以直接杀掉kill 进程ID。
避免死锁:
- 按同一顺序访问对象。
- 避免事务中的用户交互。
- 保持事务简短并在一个批处理中。
- 使用低隔离级别。
- 使用绑定连接。
隔离级别
- 读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。脏读。
- 读提交:一个事物提交之后,它做的变更才会被其他事务看到。不可重复读,同样一条记录,两次查询可能会有不同结果。
- 可重复读:一个事物执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其它事务也是不可见的。幻读,当某个事务在读取某个范围内的记录时,另一个事务在该范围内插入新的记录,再次读取产生幻行。多版本并发控制MVCC来解决。
- 串行化:同一行记录,写加写锁,读加读锁。当读写锁冲突时,后访问的事务必须等到前一事务执行完成,才能继续执行。解决幻读。
B+树和B树
MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的结构来存储的,也就是所有实际需要的数据都存放于 Tree 的叶子节点 ,而且到任何一个叶子节点 的最短路径的长度都是完全相同的,可能各种数据库(或 MySQL 的各种存储引擎)在存放自己的 B-Tree 索引的时候会对存储结构稍作改造。如 Innodb B+Tree ,在每一叶子节点 上面出了存放索引键的相关信息之外,还存储了指向与该叶子节点 相邻的后一个叶子节点的指针信息,这主要是为了加快检索多个相邻叶子节点的效率考虑。
在 Innodb 存储引擎中,存在两种不同形式的索引,主键索引的叶子节点存的是整行数据,在innodb里,主键索引也被称为聚簇索引。非主键索引的叶子节点内容是主键的值,在innodb里,非主键索引也被称为二级索引。
悲观锁、乐观锁
乐观锁顾名思义就是在操作时很乐观,认为操作不会产生并发问题(不会有其他线程对数据进行修改),因此不会上锁。但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS(compare and swap)算法实现。
总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加(悲观)锁。一旦加锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放。悲观锁在MySQL、Java有广泛的使用:MySQL的读锁、写锁、行锁等。
MySQL 索引是不是越多越好?为什么?
数据的变更(增删改)都需要维护索引,因此更多的索引意味着更多的维护成本;更多的索引意味着也需要更多的空间;过小的表,建索引可能会更慢。
主从
一个节点存了多少数据,怎么规定大小,与磁盘页对应
InnoDB存储引擎默认一个数据页大小为16kb,非叶子节点存放(key,pointer),pointer为6个字节,key为4个字节,即非叶子节点能存放16kb/14左右的key,pointer,而叶子节点如果一条数据大小为100字节,那一个叶子节点大约可存放160条数据。
如果高度为3,则可存放数据为:16kb/14 * 16kb/14 * 160大约1亿多数据。
因此InnoDB存储引擎b+树的高度基本为2-3。
- 数据库InnoDB下如何加锁?
- 分析 delect from table where user_id=“1”;这句话怎么加锁的?
- 如果user_id使用单列索引,联合索引,又是怎么加锁的?
- mysql实现事务的原理(MVCC)
- SQL 语句的具体执行过程,比如会怎么利用索引,怎么优化之类的 explain show processlist
- 为什么控制高度?(连续读磁盘 效率高)
- 详细描述b+?(以innodb索引为例给他画了下)
- innodb 数据隔离级别 (四个隔离级别说了下 顺带把脏读 幻读 不可重复度说了下)
不影响使用的扩容
CAP,mysql集群满足了什么,什么满足了CP - 数据库索引结构采用的是什么数据结构?为什么要采用这个结构?假如将数据全部加载到内存,b+树还有优势吗?理由。
- 聚集索引是什么?
主从分离延时什么造成的
切换备份机业务方需要做什么
redis实现分布式事务锁,有什么缺点
redis:
redis的模型,redis为什么快?redis为什么是单线程的?多核心机器如何部署redis(单进程占用单核)?
epoll,poll和select;
redis,mysql***作的时间数量级;
redis各种集群的方式,哨兵模式;
redis持久化的方式,aof文件太大了怎么办,主从同步的方式;
redis的五种常用数据结构,以及对应的底层数据结构的实现(zpilist,skiplist,quicklist,sds等等要有些了解);
讲讲对Redis的了解,有哪些基本类型和各自底层实现方法
- redis有哪几种数据类型吗?你比较熟悉哪几种?为什么?
- redis里面的哈希表
- Redis 底层用到了哪些数据结构?使用 Redis 的 set 来做过什么?
- Redis 使用过程中遇到什么问题?搭建过 Redis 集群吗?
- 微博刷新选取所有关注人的最新n条记录如何取
- redis分片,客户端的请求怎么处理
- 6 Redis了解么,如果Redis有1亿个key,使用keys命令是否会影响线上服务,我说会,因为是单线程模型,可以部署多个节点。
7 问我知不知道有一条命令可以实现上面这个功能。不知道
8 Redis的持久化方式,aod和rdb,具体怎么实现,追加日志和备份文件,底层实现原理的话知道么,不清楚。
9 Redis的list是怎么实现的,我说用ziplist+quicklist实现的,ziplist压缩空间,quicklist实现链表。
10 sortedset怎么实现的,使用dict+skiplist实现的,问我skiplist的数据结构,大概说了下是个实现简单的快速查询结构。
Redis 底层用到了哪些数据结构?使用 Redis 的 set 来做过什么?
Redis 使用过程中遇到什么问题?搭建过 Redis 集群吗?
消息队列:
常用的消息队列设计和适用的各种场景;
kafka的原理,kafka作为消息队列和redis的区别;
一个topic中的partition是不是一定散布在同一个broker中?
如果要保证消息全局有序,怎么做?
leader选举是怎么选的?
kafka中consumer怎么保持状态的?
kafka是哪个公司出的?(还真老有人问)
有没有用过一些消息中间件
了解什么消息队列,rmq和kafka,没细问
操作系统:
经常问的就是linux指令,死锁的各种问题,虚拟内存什么的,这块掌握的不是很好。
linux命令:打印中间一列
ab1 ab ab2
cd1 cd cd2
ef1 ef ef2
linux常考指令
操作系统
- 操作系统的竞态?自旋锁说一下
- 如何实现线程的同步?线程的上下文有哪些东西?
- 查看文件打开的句柄