总结
- 索引结构、使用及注意事项
- 引擎
- 事务、隔离级别
- MVCC实现
- 分库分表
- 实战调优
参考
数据库知识
-
数据库隔离级别有哪些,各自的含义是什么,MYSQL默认的隔离级别是是什么。
读未提交、读已提交(Oracle默认)、可重复读(MySQL默认)、可串行化
-
什么是幻读。
一个事务读取2次,得到的记录条数不一致。
-
MYSQL有哪些存储引擎,各自优缺点。
-
高并发下,如何做到安全的修改同一行数据。
-
乐观锁和悲观锁是什么,INNODB的标准行级锁有哪2种,解释其含义。
-
SQL优化的一般步骤是什么,怎么看执行计划,如何理解其中各个字段的含义。
-
数据库会死锁吗,举一个死锁的例子,mysql怎么解决死锁。
MySQL有三种锁的级别:页级、表级、行级。
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
所谓死锁
: 是指两个或两个以上的进程在执行过程中, 因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程. 表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB. 死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。
那么对应的解决死锁问题的关键就是:让不同的session加锁有次序
-
MySQL的索引原理,索引的类型有哪些,如何创建合理的索引,索引如何优化。
-
聚集索引和非聚集索引的区别。
-
select for update 是什么含义,会锁表还是锁行或是其他。
每次拿数据的时候都认为别的线程会修改数据,所以每次拿数据的时候都会给数据上锁。上锁之后,当别的线程想要拿数据时,就会阻塞。直到给数据上锁的线程将事务提交或者回滚。传统的关系数据库里面很多用了这种锁机制,比如行锁,表锁,共享锁,排他锁等,都是在做操作之前先上锁。
(1)左边的线程,在事务中通过select for update语句给sid=1的数据行上了锁,右边的线程此时可以使用select语句读取数据,但是如果也使用select for update语句就会阻塞,使用update, add, delete也会阻塞。 而当左边的线程将事务提交(或者回滚),右边的线程就会获取锁,线程不再阻塞
(2)此时右边的线程获取锁,左边的线程执行此类操作,也会被阻塞。
(3)当然,select都不行,update等写操作也要阻塞等待。for update是排他锁。
-
为什么要用Btree实现,它是怎么分裂的,什么时候分裂,为什么是平衡的。
-
数据库的ACID是什么。
-
某个表有近千万数据,CRUD比较慢,如何优化。
-
Mysql怎么优化table scan的。
-
如何写sql能够有效的使用到复合索引。
-
mysql中in 和exists 区别。
mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。
如果查询的两个表大小相当,那么用in和exists差别不大。 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。 not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
-
数据库自增主键可能的问题。
-
MVCC的含义,如何实现的。
-
你做过的项目里遇到分库分表了吗,怎么做的,有用到中间件么,比如sharding jdbc等,他们的原理知道么。
-
MYSQL的主从延迟怎么解决。