本文主要是介绍【学习笔记】数据库面试方面,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 一、数据库事务
-
- 二、数据库两种引擎(MYISAM和INNODB)
-
- 三、数据库索引
- 索引种类
- 索引的优缺点
- 索引最左前缀问题
- 四、数据库锁
- 五、其它问题
-
一、数据库事务
概念:
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。
四大特性:
原子性: 操作要么全部实行,要么全不执行;
隔离性: 在事务提交之前,其他会话无法看到过程;
一致性: 操作前后,数据的总额数不变;
持久性: 一旦事务提交,对数据的改变是永久性的。
事物的隔离级别:
读未提交: select语句不加锁,易发生脏读、幻读和不可重复读;
读已提交: 易发生幻读和不可重复读;
可重复读: 易发生幻读;
串行化: 无以上问题;但是并发性低,性能差。
脏读: 当前事务访问数据时,访问到其他事务没有提交的数据;
不可重复读: 同一事物内多次读取同一行数据,读到的数据不一样;
幻读: 当前事务执行同样的数据,返回的集合不同(例:增加了一行)。
二、数据库两种引擎(MYISAM和INNODB)
两引擎区别:*
- INNODB支持外键,MYISAM不支持,有外键的INNODB表转化成MYISAM表时会失败;
- INNODB支持事务,而MYISAM不支持;
- MYSIAM支持全文索引,5.6之前的INNODB不支持,5.6及以后的支持
- INNODB支持行锁(默认)和表锁;MYISAM支持表锁。查全表时,INNODB要全表扫描,MYISAM不需要,它有一个字段专门存储总行数;
- INNODB必须有有主键索引,而MYISAM不必须。INNODB没有指定主键索引时,会自动创建一个隐藏列Row_id来充当默认主键;
- MYISAM表格可以被压缩后进行查询操作;
- INNODB是聚集索引,用的是b+树,数据文件和索引绑定在一起,表数据文件本身也是索引文件。辅助索引文件需要两次查询,先查到逐渐,再通过主键查到数据。MYISAM是非聚集索引,也是b+树,但索引和数据分开,索引保存数据文件的指针,主键索引和辅助索引独立。即,INNODB的叶子结点存储的是数据文件,辅助索引存储的是主键值;MYISAM叶子结点都是数据文件地址指针。
三、数据库索引
索引种类
- 普通索引: 普通的索引,没有任何限制;
- 唯一索引: 索引的值唯一,允许有空值;
- 主键索引: 特殊的唯一索引,不允许有空值;
- 全文索引: 针对大数据文件,建成全文索引很慢;
- 组合索引: 也是联合索引,靠多个字段来提高查询效率;
索引的优缺点
优点: 查询效率快; 缺点: 更新数据效率低,占空间;
索引最左前缀问题
当第二个索引没有使用索引时,第三个索引也无法用索引。
四、数据库锁
乐观锁: 自主实现,通过版本号,写多读少用;
悲观锁: 共享锁,多事务只能读不能写。加 lock in share mode
排它锁: 单事务,只能写不能读。加 for update;
行锁: 用于数据行;
表锁: 用于表。
五、其它问题
long_query问题怎么解决: 设置参数,开启慢日志功能,得到耗时超过一定时间的SQL;
varchar和char的适用场景: varchar长度可变,char长度固定;
数据库连接池的作用: 维护一定数量的连接,减少创建连接的时间。跟快的响应时间,统一管理。
SQL优化:
- 子查询尽量用left join;
- limit分布优化,先用id定位,再分页;
- or条件优化:多个or可以使用union all对结果进行合并,但容易造成结果重复;
- where代替having,having检索完全部记录才开始过滤;
- 避免嵌套查询;
- 多字段联合查询用联合索引。
数据库主从复制
异步复制(默认): 容易造成主从数据库数据不一致,一个数据库为主库(Master),一个是从库(Slave)。slave用两个线程,一个读主库的Binlog日志,并将其存入自己的中继日志中,另一个解析中继日志,执行SQL;Master用一个线程给slave传输日志。
半同步复制: 只有把Master的Binlog日志写到自己的中继日志中,主库才会返回操作完成的反馈,但是性能会有一定的降低。
并行操作: salve多个线程请求Binlog日志。
MVCC
什么是MVCC: MVCC是多版本并发控制。一般在数据库管理系统中,实现数据可的并发访问,在编程语言实现事务内存。
MVCC特点:
- 每行数据都存在一个版本,每次数据更新时都会更新该版本;
- 修改时夫指出该版本随意更改,各个事务之间互不干扰;
- 保存时比较版本号,如果成功,就覆盖原纪录,失败就放弃复制。
INNODB实现MVCC的方式:
- 事务以排它锁的形式修改原始数据;
- 把修改之前的数据都存放在undo log,通过回滚指针与主数据关联;
- 修改成功啥都不做,修改失败则恢复undo log中的数据。
这篇关于【学习笔记】数据库面试方面的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!