31
31
32
32
## 索引的底层数据结构
33
33
34
- ### Hash表 & B+树
34
+ ### Hash表
35
35
36
36
哈希表是键值对的集合,通过键(key)即可快速取出对应的值(value),因此哈希表可以快速检索数据(接近 O(1))。
37
37
@@ -76,8 +76,6 @@ B 树也称 B-树,全称为 **多路平衡查找树** ,B+ 树是 B 树的一
76
76
- B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。
77
77
- B 树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定了,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。
78
78
79
- ![ ] ( https://img-blog.csdnimg.cn/20210420165409106.png )
80
-
81
79
在 MySQL 中,MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是,两者的实现方式不太一样。(下面的内容整理自《Java 工程师修炼之道》)
82
80
83
81
MyISAM 引擎中,B+Tree 叶节点的 data 域存放的是数据记录的地址。在索引检索的时候,首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。
@@ -94,6 +92,8 @@ InnoDB 引擎中,其数据文件本身就是索引文件。相比 MyISAM,索
94
92
95
93
在 MySQL 的 InnoDB 的表中,当没有显示的指定表的主键时,InnoDB 会自动先检查表中是否有唯一索引且不允许存在null值的字段,如果有,则选择该字段为默认的主键,否则 InnoDB 将会自动创建一个 6Byte 的自增主键。
96
94
95
+ ![ ] ( http://101.43.132.98:98/images/cluster-index.png )
96
+
97
97
### 二级索引(辅助索引)
98
98
99
99
** 二级索引又称为辅助索引,是因为二级索引的叶子节点存储的数据是主键。也就是说,通过二级索引,可以定位主键的位置。**
@@ -110,7 +110,7 @@ InnoDB 引擎中,其数据文件本身就是索引文件。相比 MyISAM,索
110
110
111
111
二级索引:
112
112
113
- ![ ] ( https ://img-blog.csdnimg.cn/20210420165254215 .png)
113
+ ![ ] ( http ://101.43.132.98:98/images/no-cluster-index .png)
114
114
115
115
## 聚集索引与非聚集索引
116
116
@@ -190,6 +190,20 @@ SELECT id FROM table WHERE id=1;
190
190
覆盖索引:
191
191
![ ] ( https://img-blog.csdnimg.cn/20210420165341868.png )
192
192
193
+ ## 联合索引
194
+
195
+ 使用表中的多个字段创建索引,就是 ** 联合索引** ,也叫 ** 组合索引** 或 ** 复合索引** 。
196
+
197
+ ## 最左前缀匹配原则
198
+
199
+ 最左前缀匹配原则指的是,在使用联合索引时,** MySQL** 会根据联合索引中的字段顺序,从左到右依次到查询条件中去匹配,如果查询条件中存在与联合索引中最左侧字段相匹配的字段,则就会使用该字段过滤一批数据,直至联合索引中全部字段匹配完成,或者在执行过程中遇到范围查询,如 ** ` > ` ** 、** ` < ` ** 、** ` between ` ** 和 ** ` 以%开头的like查询 ` ** 等条件,才会停止匹配。
200
+
201
+ 所以,我们在使用联合索引时,可以将区分度高的字段放在最左边,这也可以过滤更多数据。
202
+
203
+ ## 索引下推
204
+
205
+ 索引下推是 ** MySQL 5.6** 版本中提供的一项索引优化功能,可以在非聚簇索引遍历过程中,对索引中包含的字段先做判断,过滤掉不符合条件的记录,减少回表次数。
206
+
193
207
## 创建索引的注意事项
194
208
195
209
** 1.选择合适的字段创建索引:**
0 commit comments