锁机制和日志-MySQL的内部机制-事务补充-存储引擎 (死锁日志)
MySQL 是一款关系型数据库管理系统(RDBMS),它使用存储引擎来组织和管理数据。不同的存储引擎提供了不同的数据存储机制、索引技术、锁定级别等功能。本文概述了 MySQL 中可用的存储引擎,并比较了其中最常用的引擎。
数据库存储引擎
存储引擎是数据库管理系统(DBMS)的基础,它负责数据存储、检索、更新和删除。不同的存储引擎使用不同的数据结构和算法来优化特定类型的查询或工作负载。
MySQL 的存储引擎
![锁机制和日志](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
MySQL 是一款支持多种存储引擎的数据库系统。这些引擎可分为以下类别:
- 事务型引擎(例如 InnoDB、NDB)
- 非事务型引擎(例如 MyISAM、Memory)
- 特殊用途引擎(例如 Archive、Blackhole、Federated、PERFORMANCE_SCHEMA)
每个引擎都针对特定的使用场景进行了优化。例如,InnoDB 以其事务和行级锁定的支持而闻名,而 MyISAM 以其高插入和查询速度而闻名。
MyISAM 存储引擎
MyISAM 是 MySQL 5.5 之前版本的默认存储引擎。它是一种非事务型引擎,以其高插入和查询速度而闻名。它不支持事务或外键约束。
InnoDB 存储引擎
InnoDB 是 MySQL 5.5 及更高版本的默认存储引擎。它是一种事务型引擎,支持 ACID 事务、外键约束和行级锁定。InnoDB 适用于需要数据一致性和完整性的应用程序。
Memory 存储引擎
Memory 存储引擎将所有数据存储在内存中。它以极高的插入、更新和查询速度而闻名。它的缺点是会占用与数据量成正比的内存空间,并且其内容会在 MySQL 重新启动时丢失。
Archive 存储引擎
Archive 存储引擎非常适合存储大量的独立数据,这些数据作为历史记录,并且不经常被读取。它具有高效的插入速度,但其查询支持相对较差。
Federated 存储引擎
Federated 存储引擎将不同的 MySQL 服务器联合起来,在逻辑上组成一个完整的数据库。这非常适合分布式应用程序,因为它允许用户从一个服务器查询数据,而数据实际上存储在不同的服务器上。
CSV 存储引擎
CSV 存储引擎是使用逗号分隔数据的逻辑存储引擎。它会在数据库子目录中为每个数据表创建一个 .csv 文件。这种普通文本文件中的每一行都代表一个数据行。CSV 存储引擎不支持索引。
BlackHole 存储引擎
BlackHole 存储引擎是一个特殊用途的引擎,写入其中的任何数据都会消失。它通常用于记录 binlog 以进行复制的中继。
PERFORMANCE_SCHEMA 存储引擎
PERFORMANCE_SCHEMA 存储引擎主要用于收集数据库服务器性能参数。它提供有关数据库活动、性能指标和资源使用的信息。
Mrg_MyISAM 存储引擎
Mrg_MyISAM 存储引擎是 MyISAM 表的集合。它将多个 MyISAM 引擎表聚合在一起,但实际上并不包含数据。数据仍然存储在 MyISAM 引擎表中,但可以使用 Mrg_MyISAM 引擎直接查询、删除和更新数据。
MyISAM、Memory 和 InnoDB 存储引擎的比较
特性 | MyISAM | Memory | InnoDB |
---|---|---|---|
事务支持 | 否 | 否 | 是 |
行级锁定 | 否 | 否 | 是 |
插入速度 | 高 | 极高 | 中 |
查询速度 | 高 | 极高 | 中 |
内存使用 | 适中 | 高 | 适中 |
持久性 | 是(在磁盘上) | 否(在内存中) | 是(在磁盘上) |
适用于 | 只读数据、快速插入和查询 | 内存中临时数据 | 事务处理、高并发性 |
事务
事务是一系列对数据库的原子操作。这意味着要么事务中的所有操作都成功执行,要么整个事务回滚,使数据库返回到事务开始之前的状态。InnoDB 存储引擎支持事务,而 MyISAM 和 Memory 存储引擎不支持。
事务的隔离级别决定了当多个事务同时访问相同数据时,如何处理冲突。MySQL 8.x 中的事务隔离级别包括:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
锁机制
锁是一种数据库机制,它允许事务在对数据进行修改之前独占访问数据。MySQL 支持表级锁和行级锁。
- 表级锁:当事务更新表中的任何行时,会获取表级锁。这会阻止其他事务同时访问该表。
- 行级锁:当事务更新表中的特定行时,会获取行级锁。这允许其他事务同时访问表中不受影响的行。
行级锁比表级锁提供了更好的并发性,但开销更大。
总结
选择合适的存储引擎对于 MySQL 数据库的性能和可扩展性至关重要。了解不同存储引擎的优缺点对于根据应用程序的需求做出明智的决定至关重要。通常,InnoDB 适用于需要事务支持、数据一致性和高并发的应用程序。MyISAM 适用于不需要事务支持的高速插入和读取应用程序。Memory 存储引擎适用于将数据临时存储在内存中的应用程序。
一文详解-MySQL 事务和锁
当多个用户访问同一份数据时,一个用户在更改数据的过程中,可能有其他用户同时发起更改请求,为保证数据库记录的更新从一个一致性状态变为另外一个一致性状态,使用事务处理是非常必要的,事务具有以下四个特性: MySQL 提供了多种事务型存储引擎,如 InnoDB 和 BDB 等,而 MyISAM 不支持事务。 为了支持事务,InnoDB 存储引擎引入了与事务处理相关的 REDO 日志和 UNDO 日志,同时事务依赖于 MySQL 提供的锁机制 事务执行时需要将执行的事务日志写入日志文件,对应的文件为 REDO 日志。 当每条 SQL 进行数据更新操作时,首先将 REDO 日志写进日志缓冲区。 当客户端执行 COMMIT 命令提交时,日志缓冲区的内容将被刷新到磁盘,日志缓冲区的刷新方式或者时间间隔可以通过参数 innodb_flush_log_at_trx_commit 控制 REDO 日志对应磁盘上的 ib_logifleN 文件,该文件默认为 5MB,建议设置为 512MB,以便容纳较大的事务。 MySQL 崩溃恢复时会重新执行 REDO 日志的记录,恢复最新数据,保证已提交事务的持久性 与 REDO 日志相反,UNDO 日志主要用于事务异常时的数据回滚,具体内容就是记录数据被修改前的信息到 UNDO 缓冲区,然后在合适的时间将内容刷新到磁盘 假如由于系统错误或者 rollback 操作而导致事务回滚,可以根据 undo 日志回滚到没修改前的状态,保证未提交事务的原子性 与 REDO 日志不同的是,磁盘上不存在单独的 UNDO 日志文件,所有的 UNDO 日志均存在表空间对应的 数据文件中,即使 MySQL 服务启动了独立表空间 在 MySQL 中,可以使用 BEGIN 开始事务,使用 COMMIT 结束事务,中间可以使用 ROLLBACK 回滚事务。 MySQL 通过 SET AUTOCOMMIT、START TRANSACTION、COMMIT 和 ROLLBACK 等语句支持本地事务 MySQL 定义了四种隔离级别,指定事务中哪些数据改变其他事务可见、哪些数据该表其他事务不可见。 低级别的隔离级别可以支持更高的并发处理,同时占用的系统资源更少 InnoDB 系统级事务隔离级别可以使用以下语句设置: 查看系统级事务隔离级别: InnoDB 会话级事务隔离级别可以使用以下语句设置: 查看会话级事务隔离级别: 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。 读取未提交的数据称为脏读(Dirty Read),即是:首先开启 A 和 B 两个事务,在 B 事务更新但未提交之前,A 事务读取到了更新后的数据,但由于 B 事务回滚,导致 A 事务出现了脏读现象 所有事务只能看见已经提交事务所做的改变,此级别可以解决脏读,但也会导致不可重复读(Nonrepeatable Read):首先开启 A 和 B 两个事务,A事务读取了 B 事务的数据,在 B 事务更新并提交后,A 事务又读取到了更新后的数据,此时就出现了同一 A 事务中的查询出现了不同的查询结果 MySQL 默认的事务隔离级别,能确保同一事务的多个实例在并发读取数据时看到同样的数据行,理论上会导致一个问题,幻读(Phontom Read)。 例如,第一个事务对一个表中的数据做了修改,这种修改会涉及表中的全部数据行,同时第二个事务也修改这个表中的数据,这次的修改是向表中插入一行新数据,此时就会发生操作第一个事务的用户发现表中还有没有修改的数据行 InnoDB 通过多版本并发控制机制(MVCC)解决了该问题:InnoDB 通过为每个数据行增加两个隐含值的方式来实现,这两个隐含值记录了行的创建时间、过期时间以及每一行存储时间发生时的系统版本号,每个查询根据事务的版本号来查询结果 通过强制事务排序,使其不可能相互冲突,从而解决幻读问题。 简而言之,就是在每个读的数据行上加上共享锁实现,这个级别会导致大量的超时现象和锁竞争,一般不推荐使用 为了解决数据库并发控制问题,如走到同一时刻客户端对同一张表做更新或者查询操作,需要对并发操作进行控制,因此产生了锁 共享锁的粒度是行或者元组(多个行),一个事务获取了共享锁以后,可以对锁定范围内的数据执行读操作 排他锁的粒度与共享锁相同,一个事务获取排他锁以后,可以对锁定范围内的数据执行写操作 有两个事务 A 和 B,如果事务 A 获取了一个元组的共享锁,事务 B 还可以立即获取这个元组的共享锁,但不能获取这个元组的排他锁,必须等到事务 A 释放共享锁之后。 如果事务 A 获取了一个元组的排他锁,事务 B 不能立即获取这个元组的共享锁,也不能立即获取这个元组的排他锁,必须等到 A 释放排他锁之后 意向锁是一种表锁,锁定的粒度是整张表,分为意向共享锁和意向排他锁。 意向共享锁表示一个事务有意对数据上共享锁或者排他锁。 有意表示事务想执行操作但还没真正执行 锁的粒度主要分为表锁和行锁 表锁的开销最小,同时允许的并发量也是最小。 MyISAM 存储引擎使用该锁机制。 当要写入数据时,整个表记录被锁,此时其他读/写动作一律等待。 一些特定的动作,如 ALTER TABLE 执行时使用的也是表锁 行锁可以支持最大的并发,InnoDB 存储引擎使用该锁机制。 如果要支持并发读/写,建议采用 InnoDB 存储引擎
关于mysql数据库存储引擎描述
关于mysql数据库存储引擎描述
MySQL数据库有多种存储引擎,每种存储引擎都有其特定的特点和用途。以下是一些关于MySQL数据库存储引擎的描述:
1. InnoDB存储引擎:InnoDB是MySQL的默认存储引擎,它提供了事务支持、行级锁定和外键约束等功能。InnoDB适合于需要事务支持和复杂查询的应用程序。
2. MyISAM存储引擎:MyISAM是MySQL早期版本中常用的存储引擎,它不支持事务支持,但提供了全文搜索、表锁和全文索引等功能。MyISAM适合于不需要事务支持的应用程序。
3. Memory存储引擎:Memory存储引擎将数据存储在内存中,可以快速检索数据。Memory适合于需要快速检索数据的应用程序,但需要注意内存溢出的问题。
4. Archive存储引擎:Archive存储引擎适合于需要大量数据的备份和归档,它提供了高压缩比和低读写性能。
5. NDB Cluster存储引擎:NDB Cluster是一个分布式存储引擎,它提供了高可用性和高并发性能。NDB Cluster适合于需要高可用性和高并发性能的应用程序。
总之,MySQL数据库的存储引擎可以根据应用程序的需求进行选择,不同的存储引擎具有不同的特点和用途。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。