数据库基础知识点总结(长文慎入!)

本文详细总结了数据库事务的四大特性及其在并发控制中的重要性,包括原子性、一致性、隔离性和持久性。同时,探讨了MySQL中的事务隔离级别选择,以及其默认的可重复读隔离级别。此外,文章还深入讲解了索引的作用、类型,如B+Tree,并分析了为何B+Tree更适合做文件索引。还提到了索引失效的情况、覆盖索引的概念以及如何通过explain分析SQL执行效率。最后,文章对比了MyISAM和InnoDB存储引擎的差异,强调了InnoDB的事务支持和行级锁优势。
摘要由CSDN通过智能技术生成

1. 什么是数据库事务?数据库事务的四个特性是什么?

解析:事务是很重要的概念,不管在数据库里还是问到项目框架,都会被问到。简单来说——

事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vn0Gnvex-1582788508541)(/upload/20191203/157535281975806.png)]

四个特性:

  • 原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;

  • 一致性(Consistency): 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;

  • 隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;

  • 持久性(Durability): 一个事务被提交之后,它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

  • 事务的并发问题有哪些?数据库的隔离级别有哪几种?是不是隔离级别越高越好?我们应该如何选择隔离级别?

    并发问题:

    • 脏读
    • 丢失修改
    • 不可重复读
    • 幻读

    隔离级别:

    • READ-UNCOMMITTED(读取未提交)
    • READ-COMMITTED(读取已提交)
    • REPEATABLE-READ(可重复读)
    • SERIALIZABLE(可串行化)

    隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读等并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

2. 请分别举例说明幻读和不可重复读,并描述一下它们之间的区别

不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了。

3. Mysql的默认隔离级别是什么?那么Mysql在实际企业中一般使用的隔离级别是什么吗?为什么?

Mysql5.5及以后默认隔离级别是可重复读。

  1. 在RR隔离级别下,存在间隙锁,导致出现死锁的几率比RC大的多!
  2. 在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,只锁行
  3. 在RC隔离级别下,半一致性读(semi-consistent)特性增加了update操作的并发性!

4. 为什么要使用索引?

  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
  • 可以大大加快数据的检索速度(大大减少检索的数据量),这是创建索引的最主要原因
  • 帮助服务器避免排序和临时表
  • 可以将随机IO变为顺序IO

5. 索引这么多优点,为什么不对表中每个字段都创建索引呢?

  • 当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度
  • 索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
  • 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

6. 索引是如何提升查询速度的?

将无序的数据变成相对有序的数据(就像目录一样)。

7. 请说出你知道的索引失效的几种情况?

  1. 有or必全有索引;
  2. 复合索引未用左列字段;
  3. like以%开头;
  4. 需要类型转换;
  5. where中索引列有运算;
  6. where中索引列使用了函数;
  7. 如果mysql觉得全表扫描更快时(数据少);

详细解释查看索引失效的几种情况

8. 什么是聚簇索引与非聚簇索引

  • 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据

  • 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,

    澄清一个概念:innodb中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值。

    详细了解请参照聚簇索引和非聚簇索引

9. Mysql索引主要使用的数据结构有哪些?

  • 哈希索引:对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引;

  • 有序数组:有序数组在等值查询和范围查询场景中的性能都非常优秀。用二分法就可以快速找到(时间复杂度为O(logN))。但是如果要往中间插入一条数据,则必须挪动后面的所有记录,成本较高。因此,有序数组只适用于静态存储引擎,即数据表一旦建立后不再会修改。

  • BTree索引:Mysql的BTree索引使用的是B树的B+Tree。但对于主要的两种存储引擎(MyISAM和InnoDB)的实现方式是不同的。

10. 谈谈MyISAM和innoDb实现Btree索引方式的区别

  • MyISAM:*B+Tree叶节点的data域存放的是数据记录的地址。*在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址读取相应的数据记录,这被称为“非聚簇索引”
  • InnoDB:*其数据文件本身就是索引文件。*相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按照B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引,这被称为“聚簇索引(或聚集索引)”,而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是与MyISAM不同的地方。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。

11. B+tree与B-tree的区别是什么?为什么B+tree更适合做文件索引?

  • B+tree与B-tree的区别:

    在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。

  • B+tree更适合做文件索引,因为B+ Tree的内部节点并没有指向关键字具体信息的指针,所以他的内部节点比其他结构的更小,同样大小的盘块能够容纳更多的单位索引结构,一次性读入内存的关键字信息索引就更多,相对来说IO读写次数也就少很多。

12. 什么是覆盖索引?请举例说明

如果一个索引包含(或者说覆盖)所有需要查询的字段的值

  • 13
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值