系列文章
关于时间复杂度o(1), o(n), o(logn), o(nlogn)的理解
文章目录
前言
MySQL是众多Java开发者首选的数据库之一,因为其是一个开源的关系型数据库管理系统,拥有庞大的用户社区和活跃的开发者生态系统。在处理大规模数据和高并发请求时表现优异。与Java的兼容性非常好,提供了多种Java开发所需的接口和驱动程序。它提供了事务支持、ACID特性以及数据复制和故障恢复机制,确保数据的一致性、持久性和可靠性。同时,MySQL支持水平和垂直两种方向的扩展,可以根据应用程序的需求进行灵活的扩展和配置。
一、事务隔离级别
MySQL默认的事务隔离级别是 “可重复读”(Repeatable Read)。这意味着在同一个事务中,多次读取相同的数据会得到相同的结果,即使其他事务对数据进行了修改或插入操作,也不会影响当前事务中的读取结果。MySQL的可重复读隔离级别通过使用快照读(Snapshot Read) 和在事务中保持一致的读取视图来实现。。
二、存储引擎
最常见的包括InnoDB和MyISAM,它们在设计和功能上有一些显著的区别:
1.事务支持
InnoDB引擎支持事务,具有ACID(原子性、一致性、隔离性、持久性)特性,可以确保数据的完整性和一致性。而MyISAM引擎不支持事务,因此在需要事务支持的应用场景下不太适用。
2.行级锁和表级锁
InnoDB引擎支持行级锁,可以在并发访问时提高性能并减少锁冲突。而MyISAM引擎只支持表级锁,因此在高并发环境下可能会出现较多的锁竞争,影响性能。
三、B+树的索引结构以及索引覆盖、回表查询
1.B+树的索引结构
B+ 树是一种多路平衡查找树,它的特点是非叶子节点存储索引值,叶子节点存储实际数据。
在 B+ 树中,叶子节点之间通过指针进行连接,形成一个有序的链表,便于范围查询。
B+ 树的非叶子节点通常称为索引节点,叶子节点存储数据,最底层的叶子节点称为数据页,存储实际的数据记录。
2.理解索引覆盖查询和回表查询
覆盖索引查询
覆盖索引查询是指查询操作所涉及的字段都包含在了索引中,查询结果可以直接从索引中获取的查询操作。
在 B+ 树结构中,覆盖索引查询可以直接在索引的叶子节点上完成。因为叶子节点存储了索引字段的值以及数据行的指针或主键值,如果查询所需的字段都在索引中,那么可以直接从叶子节点获取这些值,并返回给用户,无需额外的数据检索操作。
回表查询
回表查询是指在使用索引进行查询时,需要根据索引中的指针或主键值,再次到数据页(叶子节点)中检索实际的数据记录,才能获取查询结果的查询操作。
在 B+ 树结构中,回表查询涉及到从索引的叶子节点(包括底层叶子节点)回溯到对应的数据页,然后再获取实际的数据记录。
回表查询会在叶子节点和底层叶子节点之间发生,因为索引叶子节点中只存储了索引字段的值和指向数据行的指针或主键值,而实际的数据记录存储在底层叶子节点中。因此,回表查询的结果返回层级通常是底层叶子节点。
综上所述,覆盖索引查询的结果返回层级通常是索引的叶子节点,而回表查询的结果返回层级通常是底层叶子节点,因为回表查询需要到底层叶子节点中获取实际的数据记录。
四、日志文件
在 MySQL 中,底层的日志文件主要包括以下几种:
错误日志 (Error Log): 错误日志是 MySQL 服务器记录所有错误、警告以及其他相关信息的文件。它包含了服务器启动和运行过程中的诊断信息,以及一些重要事件的记录。错误日志对于故障排除和性能优化非常重要。
查询日志 (Query Log): 查询日志记录了所有到 MySQL 服务器的查询请求,包括对数据库的读取和写入操作。启用查询日志可以帮助跟踪应用程序对数据库的访问情况,便于性能优化和安全审计。
慢查询日志 (Slow Query Log): 慢查询日志记录了执行时间超过阈值的查询语句。通过分析慢查询日志,可以发现性能瓶颈,并对查询进行优化,提高数据库的响应速度。
二进制日志 (Binary Log): 二进制日志包含了对数据库执行的所有更改操作,以二进制格式记录。它用于数据复制(replication)、故障恢复以及点播(point-in-time recovery)等场景。通过二进制日志,可以在主服务器上记录所有更改并将其传输到一个或多个从服务器,从而实现数据复制。
重做日志 (Redo Log): 重做日志记录了已经提交的事务对数据库所做的修改。它确保了事务的持久性,即使在系统崩溃或断电时,MySQL 也能够通过重做日志来恢复数据。
回滚日志 (Undo Log): 回滚日志记录了事务执行过程中的撤销操作,用于事务的回滚和 MVCC 的实现。它记录了事务对数据的修改操作及其对应的版本信息,在事务回滚或系统崩溃时,可以利用回滚日志来恢复数据到事务开始之前的状态。
这些日志文件在 MySQL 中起着不同的作用,对于数据库的管理、维护和故障恢复都至关重要。
五、MVCC
MVCC(Multi-Version Concurrency Control)是MySQL等数据库系统中用于实现并发控制的一种技术。它允许多个事务在同时对数据库进行读写操作时,能够达到较高的并发性而不产生数据不一致的问题。
MVCC的核心思想是在数据被修改时不直接覆盖原始数据,而是创建新版本的数据,并且在事务开始时确定一个可见性规则,以确保事务只能看到适当版本的数据。这样,在事务中对数据进行读取时,可以根据事务开始时创建的一致性读取视图来获取数据,而不会受到其他事务修改的影响。
下面是MVCC的几个关键概念:
版本号: 每个数据行都会关联一个版本号或者时间戳,用来标识该数据行的版本信息。当数据被修改时,会创建一个新的版本,并更新版本号。
数据行的状态: 在MVCC中,数据行可以处于不同的状态,比如已提交、未提交等。这些状态可以用来判断事务是否能够看到该行的数据。
Read View(读取视图): 在事务开始时,MySQL会为当前事务创建一个一致的读取视图。这个读取视图包含了事务开始时数据库中所有数据行的版本信息。在事务执行期间,该读取视图保持不变,以确保事务读取到的数据是一致的。
可见性规则: 在MVCC中,对数据行的读取要符合可见性规则。一般情况下,事务只能看到已提交状态的数据,而看不到未提交或已经被删除的数据。
MVCC的实现使得数据库系统在并发访问时能够保持数据的一致性,并且提高了系统的并发性能。MySQL通过MVCC来实现不同的隔离级别,包括可重复读隔离级别。通过维护一致的读取视图和版本控制,MySQL可以实现事务的隔离性,并且避免了读取操作受到其他并发事务修改的影响。