当提到数据库管理系统(DBMS)时,MySQL 往往是首选的开源关系型数据库之一。MySQL 提供了强大的功能,涵盖了许多数据库管理方面的核心概念,其中包括索引、事务和隔离级别。在本篇博客中,我们将深入探讨这些关键概念以及它们在 MySQL 中的作用~~
目录
索引:数据库的关键性能优化工具
1.什么是索引?
2.为什么使用索引?
3.如何创建索引?
事务:确保数据库的一致性和完整性
1.什么是事务?
2.为什么使用事务?
3.如何使用事务?
4.事务的四大特性
隔离级别:管理事务之间的可见性
1.什么是隔离级别?
2.不同隔离级别的特点
事务常见的并发问题
不可重复读(Non-repeatable Read):
脏读(Dirty Read):
幻读(Phantom Read):
数据库查询用到的数据结构分析
索引:数据库的关键性能优化工具
1.什么是索引?
在 MySQL 中,索引是一种数据结构,它可以加速对表中数据的检索操作。索引的工作原理类似于书籍的目录,它提供了一种快速查找数据的方式,而不必扫描整个表格。
2.为什么使用索引?
- 提高查询性能:通过使用索引,数据库可以更快速地定位和检索数据,特别是在大型表中。
- 加速排序和连接操作:索引还有助于排序和连接操作,这些操作通常需要更多的计算资源。
3.如何创建索引?
在 MySQL 中,你可以使用 CREATE INDEX
语句来创建索引,通常是在表创建后或在已存在的表上添加索引。例如:
CREATE INDEX idx_username ON users(username);
这将在名为 "users" 的表的 "username" 列上创建一个索引。
需要注意的是主键会自带索引,unique也会~~
事务:确保数据库的一致性和完整性
1.什么是事务?
事务是一组数据库操作,它们要么全部成功执行,要么全部失败,没有中间状态。在 MySQL 中,事务是用来确保数据库的一致性和完整性的关键机制。
2.为什么使用事务?
- 数据一致性:事务可以确保数据在多个操作之间保持一致,即使在操作期间发生故障也不会丢失数据。
- 数据完整性:事务可以保护数据免受意外的修改或损坏。
- 并发控制:事务还用于管理多个用户同时访问数据库的情况,以防止数据冲突和混乱。
3.如何使用事务?
在 MySQL 中,你可以使用 BEGIN
、COMMIT
和 ROLLBACK
语句来管理事务。例如:
BEGIN; -- 开始事务
-- 执行一系列数据库操作
COMMIT; -- 提交事务,将更改保存到数据库
-- 或者
ROLLBACK; -- 回滚事务,撤销更改
回滚事务:当第一个sql执行完了,数据库崩溃,当下次数据库重新启动完成之后,就会自动把上次修改一半的数据给进行还原~~
4.事务的四大特性
-
原子性(Atomicity):
- 原子性确保事务是一个不可分割的操作单元。要么所有的操作都成功执行,要么全部失败回滚,不存在中间状态。如果事务的任何部分失败,那么数据库会自动回滚到事务开始之前的状态,以确保数据的一致性。
-
一致性(Consistency):
- 一致性保证了事务的执行不会破坏数据库的完整性约束。在事务开始和结束时,数据库必须处于一致的状态。这意味着事务必须使数据库从一个一致的状态转移到另一个一致的状态,而不会违反任何完整性约束。
-
隔离性(Isolation):
- 隔离性确保事务在并发执行时不会相互干扰。每个事务都应该感觉自己是唯一执行的,即使有多个事务同时运行。为了实现隔离性,数据库系统通常使用锁和其他机制来管理并发访问。
-
持久性(Durability):
- 持久性确保一旦事务提交,其结果将永久保存在数据库中,即使系统崩溃或断电也不会丢失。数据库系统通常将已提交的事务的更改记录在持久存储介质(例如磁盘)上,以确保数据的持久性。
隔离级别:管理事务之间的可见性
1.什么是隔离级别?
隔离级别定义了在一个事务中所做的更改对其他事务的可见性程度。MySQL 提供了四个隔离级别,分别是 READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读) 和 SERIALIZABLE(可重复读)。
2.不同隔离级别的特点
-
READ UNCOMMITTED(读未提交):
- 最低的隔离级别,不提供任何隔离性。
- 允许一个事务读取另一个事务未提交的更改。
- 可能导致脏读、不可重复读和幻读问题。
- 通常不建议在生产环境中使用。
-
READ COMMITTED(读已提交):
- 允许一个事务只能读取已提交的更改,避免了脏读。
- 但仍可能存在不可重复读和幻读的问题。
- 是大多数数据库系统的默认隔离级别。
-
REPEATABLE READ(可重复读):
- 确保一个事务在同一查询中多次读取相同数据时获得一致的结果。
- 避免了脏读和不可重复读,但仍可能存在幻读。
- MySQL 的默认隔离级别。
-
SERIALIZABLE(串行化):
- 最高的隔离级别,确保一个事务不会受到其他事务的影响。
- 避免了脏读、不可重复读和幻读问题,但会对并发性产生较大影响。
- 适用于需要最高数据完整性和一致性的场景,但性能较差。
事务常见的并发问题
-
不可重复读(Non-repeatable Read):
- 不可重复读发生在一个事务在读取同一行数据的两次操作之间,另一个并发事务修改了这一行数据,导致第一事务两次读取到的数据不一致。
- 这可能会导致事务在不同时间点看到不同的数据状态。
- 举个例子
解决方法:
- 使用较高隔离级别,如 REPEATABLE READ 或 SERIALIZABLE,以减少不可重复读的概率。
- 在需要读取数据的事务中使用锁,或者使用数据库提供的事务隔离级别。
- 举个例子
-
脏读(Dirty Read):
- 脏读发生在一个事务读取了另一个事务未提交的数据时。如果未提交的事务回滚,那么脏读操作就读取了不正确的数据。
- 脏读可能导致事务基于不稳定的数据做出决策,最终导致数据不一致。
- 举个例子:
解决方法:
- 使用较高隔离级别,如 READ COMMITTED、REPEATABLE READ 或 SERIALIZABLE,以避免脏读。
- 在写入数据时使用事务,并在事务完成后再允许其他事务读取数据。
- 举个例子:我和朋友们商量号,在我写代码的过程中不要来看,等我改完,提交到csdn,你们在通过我的csdn来看,“写操作”和“读操作”不能并发了~~
-
幻读(Phantom Read):
- 幻读发生在一个事务在两次查询之间,另一个并发事务插入了新行或删除了行,导致第一事务两次查询得到的行数不一致。
- 幻读通常与范围查询有关,例如,在一个事务内查询某个范围的数据行。
- 举个例子:
解决方法:
- 使用较高隔离级别,如 SERIALIZABLE,以避免幻读。
- 使用行级锁或其他并发控制手段来确保在事务执行期间数据不被插入或删除。
- 举个例子:
数据库查询用到的数据结构分析