数据库

觉知此事要躬行...

Posted by Lydia on July 26, 2020

总结

  • 索引结构、使用及注意事项
  • 引擎
  • 事务、隔离级别
  • MVCC实现
  • 分库分表
  • 实战调优

参考

史上最全阿里 Java 面试题总结

MySQL数据库面试题(2020最新版)

MySQL实战45讲)


数据库知识

  1. 数据库隔离级别有哪些,各自的含义是什么,MYSQL默认的隔离级别是是什么。

    读未提交、读已提交(Oracle默认)、可重复读(MySQL默认)、可串行化

    五分钟搞清楚MySQL事务隔离级别

    15352624354970.jpg

  2. 什么是幻读。

    一个事务读取2次,得到的记录条数不一致。

    脏读、幻读与不可重复读

  3. MYSQL有哪些存储引擎,各自优缺点。

    参考

  4. 高并发下,如何做到安全的修改同一行数据。

    高并发下,如何做到安全的修改同一行数据

    并发访问时,在数据库如何安全地修改同一行数据

  5. 乐观锁和悲观锁是什么,INNODB的标准行级锁有哪2种,解释其含义。

    参考

    MySQL 乐观锁与悲观锁

  6. SQL优化的一般步骤是什么,怎么看执行计划,如何理解其中各个字段的含义。

    优化 sql 语句的一般步骤

    执行计划

  7. 数据库会死锁吗,举一个死锁的例子,mysql怎么解决死锁。

    MySQL有三种锁的级别:页级、表级、行级。

    表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

    行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

    页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

    所谓死锁: 是指两个或两个以上的进程在执行过程中, 因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程. 表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB.

    死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。

    那么对应的解决死锁问题的关键就是:让不同的session加锁有次序

    数据库常见死锁原因及处理

    参考

  8. MySQL的索引原理,索引的类型有哪些,如何创建合理的索引,索引如何优化。

    详解Mysql索引原理及其优化

    索引的使用、原理和设计优化

  9. 聚集索引和非聚集索引的区别。

    聚集索引和非聚集索引(整理)

  10. select for update 是什么含义,会锁表还是锁行或是其他。

    每次拿数据的时候都认为别的线程会修改数据,所以每次拿数据的时候都会给数据上锁。上锁之后,当别的线程想要拿数据时,就会阻塞。直到给数据上锁的线程将事务提交或者回滚。传统的关系数据库里面很多用了这种锁机制,比如行锁,表锁,共享锁,排他锁等,都是在做操作之前先上锁。

    (1)左边的线程,在事务中通过select for update语句给sid=1的数据行上了锁,右边的线程此时可以使用select语句读取数据,但是如果也使用select for update语句就会阻塞,使用update, add, delete也会阻塞。 而当左边的线程将事务提交(或者回滚),右边的线程就会获取锁,线程不再阻塞

    (2)此时右边的线程获取锁,左边的线程执行此类操作,也会被阻塞。

    (3)当然,select都不行,update等写操作也要阻塞等待。for update是排他锁。

  11. 为什么要用Btree实现,它是怎么分裂的,什么时候分裂,为什么是平衡的。

  12. 数据库的ACID是什么。

    ACID

  13. 某个表有近千万数据,CRUD比较慢,如何优化。

    参考

  14. Mysql怎么优化table scan的。

  15. 如何写sql能够有效的使用到复合索引。

    参考

  16. 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要快。

  17. 数据库自增主键可能的问题。

    参考

  18. MVCC的含义,如何实现的。

    MYSQL MVCC实现原理

  19. 你做过的项目里遇到分库分表了吗,怎么做的,有用到中间件么,比如sharding jdbc等,他们的原理知道么。

    参考

  20. MYSQL的主从延迟怎么解决。

    MySQL 分库分表方案,总结的非常好!

    干货丨数据库分库分表基础和实践

    参考

参考

image