数据库概念学习
1. mysql默认的事物级别
MySQL 默认的隔离级别是可重复读(REPEATABLE READ)。
PostgreSQL 中,默认的隔离级别是读已提交(READ COMMITTED)
可重复读隔离级别是 MySQL 的默认隔离级别,它具有以下特点:
事务读取的数据集是一个一致性视图(consistent snapshot),即事务开始时刻的数据状态。在同一事务中,无论其他事务对数据的修改如何,事务始终看到一致的数据快照。
事务期间读取的数据不会受到其他并发事务的修改影响。即使其他事务对数据进行了修改,事务内部仍然能够读取到最初一致性视图中的数据。
事务在提交之前对数据的修改对其他事务是不可见的。只有当事务提交后,其他事务才能看到该事务所做的修改。
可重复读隔离级别提供了较高的隔离性和数据一致性,适用于大多数应用场景。然而,由于事务期间持有锁的时间较长,可能导致锁竞争和并发性能下降。如果应用需要更高的并发性能,可以考虑将隔离级别调整为读已提交(READ COMMITTED)。
2. mysql的索引结构
MySQL 使用多种索引结构来支持高效的数据检索,其中最常用的索引结构是B+树索引。下面是 MySQL 中常见的索引结构:
B+树索引:B+树索引是 MySQL 最常用的索引结构。B+树是一种平衡树结构,它具有以下特点:
支持快速的索引扫描:B+ 树索引结构具有良好的平衡性和高度的平均查询性能。在 B+ 树中,从根节点到叶子节点的路径长度相等或相差不大,这使得索引扫描的平均时间复杂度为 O(log n),其中 n 是索引中的键值对数量。
所有数据都存储在叶子节点上,非叶子节点仅用于索引和导航。
范围查询和排序性能优化 叶子节点按照键值的顺序形成一个有序链表,可以支持范围查询。
B+树索引适用于等值查询和范围查询,并且对于大部分数据库工作负载都能提供高效的性能。
哈希索引:哈希索引是基于哈希表实现的索引结构。哈希索引具有以下特点:
使用哈希算法将键值映射到哈希表中的桶(bucket)。
哈希索引适用于等值查询,但不支持范围查询。
哈希索引在内存中进行查找,查询速度非常快,但在磁盘上的存储和更新操作相对较慢。
全文索引:全文索引是用于全文搜索的索引结构,用于在文本数据中进行关键字搜索。全文索引具有以下特点:
使用特殊的算法和数据结构来构建索引,以支持文本匹配和搜索。
全文索引适用于模糊搜索和自然语言查询。
MySQL 提供了全文索引的支持,例如使用 InnoDB 引擎的全文索引和使用 MyISAM 引擎的全文索引。
3. 事务特性
原子性(Atomicity):一个事务中的所有操作,要么全部成功,要么失败全部回滚,不会结束在某个中间环节。原子性由undo log日志来实现
一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。由其他三个特性及业务代码正确逻辑来实现
隔离性((Isolation):一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。隔离性由MySQL各种锁以及MVCC机制来实现
持久性(Durable):一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的,即使系统故障也不会丢失。持久性由redo log日志来实现
4. 隔离级别
InnoDB引擎定义了四种隔离级别,级别越高事务隔离性越好,但性能就越低
read uncommit(读未提交),事务A读取到了事务B已经修改但尚未提交的数据
read commit(读已提交):Oracle和SQL Server的默认隔离级别,一个事务只能看见已经提交事务所做的改变
repeatable read(可重复读):MySQL的默认隔离级别,无论事务B如何修改数据,事务A内部相同查询语句在不同时刻查询出来的结果都是一致的,即在第一次查询之后就不会发生变化(除非事务A更新了这行数据,由快照读变为当前读)
serializable(串行化) :所有事务对同一条数据的读和写只允许串行执行,解决了脏读、不可重复读、幻读的问题
5 事务并发遇到的问题
脏写(Dirty Write):Session A修改了Session B修改过但尚未提交的数据
脏读(Dirty Read):Session A读取到了Session B已经修改但尚未提交的数据
不可重复读(Non-Repeatable Read):Session A内部的相同查询语句在不同时刻读出的结果不一致,不符合隔离性
幻读(Phantom):Session A读取到了Session B提交的新增数据,不符合隔离性
参考文章:
MySQL事务隔离级别与锁机制(一) https://zhuanlan.zhihu.com/p/591676550?utm_id=0
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!