mysql知识点

声明:本文章根据 小林coding 图解mysql进行些许改编。侵权删。本文持续更新。 索引篇 什么是索引 当你想查阅书中某个知识的内容,你会选择一页一页的找呢?还是在书的目录去找呢? 傻瓜都知道时间是宝贵的,当然是选择在书的目录去找,找到后再翻到对应的页。书中的目录,就是充当索引的角色,方便我们快速查找书中的内容,所以索引是以空间换时间的设计思想。 那换到数据库中,索引的定义就是帮助存储引擎快速获取数据的一种数据结构,形象的说就是索引是数据的目录。 下图是 MySQL 的结构图,索引和数据就是位于存储引擎中: 索引分类 按「数据结构」分类 B+tree索引、Hash索引、Full-text索引。 按「物理存储」分类 聚簇索引(主键索引)、二级索引(辅助索引)。 主键索引的 B+Tree 的叶子节点存放的是实际数据,所有完整的用户记录都存放在主键索引的 B+Tree 的叶子节点里; 二级索引的 B+Tree 的叶子节点存放的是主键值,而不是实际数据。 所以,在查询时使用了二级索引,如果查询的数据能在二级索引里查询的到,那么就不需要回表,这个过程就是覆盖索引。如果查询的数据不在二级索引里,就会先检索二级索引,找到对应的叶子节点,获取到主键值后,然后再检索主键索引,就能查询到数据了,这个过程就是回表。 按「字段特性」分类 主键索引、唯一索引、普通索引、前缀索引。 唯一约束(UNIQUE KEY)就是一种索引 所以主键就是索引。。 ON DUPLICATE KEY UPDATE 提供无则插入、有则更新 的原子性upsert命令,避免先查再写的并发问题。 常用于实现幂等写入,但不属于乐观锁。 MySQL 在执行 INSERT ... ON DUPLICATE KEY UPDATE 后,会返回一个整数值告诉你有多少行被影响了。 规则如下(重要,正是因为这里容易错): 实际发生的情况 affected_rows 说明 真正插入了一条新记录 1 原来没有这行,插入成功 更新了一条记录,并且数据真的被修改了 2 冲突后走 UPDATE,且字段值确实变了 更新了一条记录,但数据没有任何变化 0 冲突后走 UPDATE,但 SET 后的值和原来一样 按「字段个数」分类 单列索引、联合索引。 B+Tree B+Tree 是一种多叉树,叶子节点才存放数据,非叶子节点只存放索引,而且每个节点里的数据是按主键顺序存放的。每一层父节点的索引值都会出现在下层子节点的索引值中,因此在叶子节点中,包括了所有的索引值信息,并且每一个叶子节点都有两个指针,分别指向下一个叶子节点和上一个叶子节点,形成一个双向链表。 图有误,叶子节点是双向链表 通过主键查询商品数据的过程: 比如,我们执行了下面这条查询语句: ...

May 7, 2026 · 4 min · 664 words · Jamaisvu