索引
1.mysql有哪些索引?
按底层的数据机构分:
. b+树索引,哈希索引,全文索引
按物理存储分:
聚集索引,非聚集索引
按照mysql中的分类来看有:
普通索引,唯一索引,联合索引,主键索引
2.为什么mysql要用b+树做索引,它的优势是什么?
答:
(1)b+树的树中节点不存放数据,大大减少了存放的开支,可以存储更多的key值,让树的层数更低,减少了磁盘io(索引是存储在磁盘中的,读节点),增加了查询效率,举个例子来说100w的数据,b+树也大概只需要3层就可以存储所有的key值
(2)b+树支持高效的范围查询,b+树可以快速的找到对应的叶子节点,并且叶子节点是在最后一层按照顺序将链表链接到一起的,所以更加的方便范围查询的遍历。
(3)插入和删除节点的时候有时b树需要调整树的结构这比较复杂,b+树插入和删除操作只需要调整叶子节点。如果叶子节点超过最大容量或少于最小容量,可以进行分裂或合并操作,但不需要调整内部节点。
3.索引在什么时候会失效?
(1)对于联合索引来说,必须按照创立的时候顺序进行查询,从左往右依次查询,如果跳过了中间的某些列,查询就会导致索引失效,必须创建索引的列是ABC,如果查询AC索引就会失效。
(2)范围查询,当where条件中包含>,<号这些可能会导致索引失效,一般来说索引必须是等值
(3)在索引列上进行运算操作会导致索引失效
(4)模糊查询,如果是尾部模糊,前面是等值的那索引还有效,否则索引失效。
(5) 如果用or条件,前面的条件有索引后面的没索引,那么就会导致索引失效。
4.什么时候创建索引?
要对某些特殊的字段创建索引,这些字段一般是要跟在where,join,order,group这些特定关键字后面。
主键索引,对于主键会自动创建一个聚类索引
唯一索引,如果某个列有唯一性约束,就要创建一个唯一索引
5.什么时候不应该创建索引
表的数据量比较小
频繁的插入删除和更新操作
数据列的值分布比较平均,比如性别这样的,只有男和女。
事务
1.事务的四个特性
(1)原子性 (Atomicity)
定义: 事务是一个不可分割的最小工作单元。事务中的所有操作要么全部成功提交,要么全部失败回滚。不可能停留在中间某个状态。
-
实现原理: 主要靠 Undo Log(回滚日志)。
-
直观理解: 就像你刚才理解的,Undo Log 记录了如何把数据改回去。如果事务执行一半出错了,或者你手动执行了 ROLLBACK,MySQL 就会利用 Undo Log 把已经改动的数据"逆向操作"回来,保证就像什么都没发生过一样。
(2). 一致性 (Consistency)
定义: 事务执行前后,数据库的完整性约束没有被破坏,数据库从一个一致性状态转移到另一个一致性状态。
-
实现原理: 这是事务追求的最终目标。它不仅靠数据库机制(如:原子性、隔离性、持久性),还靠代码逻辑和约束(如:外键、唯一索引、非空限制)。
-
直观理解: 比如银行转账,A 给 B 转 100 元。一致性要求:无论转账成功还是失败,A 和 B 的钱加起来的总数必须是不变的。
- 隔离性 (Isolation)
定义: 数据库允许多个并发事务同时对数据进行读写。隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
-
实现原理: 主要靠 锁机制 (Locking) 和 MVCC (多版本并发控制)。
-
直观理解: 这就是你刚才问的部分。MVCC 让不同的事务在同一时间看到的是不同版本的数据(通过 ReadView 和 Undo Log 拼凑),从而让事务之间像是在"互相隔离"的平行时空里运行,互不干扰。
- 持久性 (Durability)
定义: 事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障(比如断电、宕机)不应该对其有任何影响。
-
实现原理: 主要靠 Redo Log(重做日志)。
-
直观理解: 当你提交事务时,MySQL 会把修改记录写到 Redo Log 里并刷到磁盘。即使数据库刚改完还没来得及更新真正的物理表(数据页)就断电了,重启后 MySQL 也会根据 Redo Log 把数据找回来。
2.谈一下你对mvccc的理解
mvcc(多版本并发控制),这个是mysql解决多个事务同时对表进行修改和查询,防止事务之间的操作导致数据不一致或者冲突问题的解决办法。mvcc和锁实现了mysql事务中的隔离性。它的实现主要是通过下面两个模块
(1)undolog日志
undolog日志记录着每个事务操作的反操作,拿到这个undolog日志,就可以将数据回滚到某个特定的版本。
(2)readview对象
m_ids:当前活跃事务的id
min_id:版本链的最小id
max_id:版本链的最大id
''creator_id:创建者的id
这里主要通过这些值来规定事务之间的可见性。可见性指的就是这个事务做的操作,我能不能看见。

(3)事务的隔离级别
读提交:每次select都会生成一个(当前版本)readview
可重复读:不会重复生成,复用第一次的。
事务中的select读取到不是真正的表,而是mvcc通过表+undolog文件生成的一个临时快照
这里
3.隔离级别的理解

锁
1.mysql中有哪些锁,锁的作用是什么