MySQL索引
MySQL索引
重言MySQL索引
一、概述
索引(Index)是帮助MySQL高效获取数据的数据结构。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这种数据结构以某种方式指向数据,从而实现开始的查找数据。
优点:提高数据检索效率,降低数据库IO成本,降低CPU消耗。
缺点:索引需要占用空间,降低插入、更新、修改表的效率。
二、索引结构
索引结构 | 描述 |
---|---|
B+Tree | 最常见的索引 |
Hash | 基于Hash表实现,用于精确匹配,不支持范围查询 |
R-Tree | 空间索引是MyISAM的特殊索引类型,用于地理空间数据类型 |
Full-Tree | 通过建立倒排索引,快速匹配文档 |
B+Tree
二叉树的缺点:顺序插入时,会形成一个链表,查询性能降低,在大数据量的情况下,子树节点层级会较深,检索速度慢。
红黑树:有效解决了顺序插入问题,但是在大数据量的情况下,子树节点层级还是会较深,检索速度慢。
B-Tree:多路平衡查找树
B+Tree:所有数据都会出现在叶子结点,同时形成一个单向链表。
在MySQL中,对B+Tree做了优化,增加了一个指向相邻叶子节点的链表指针,形成了带有顺序指针的B+Tree,从而提高了区间的访问性能。
Hash
哈希索引使用Hash算法将key转为新的hash值,将原始的key映射到新的槽位上,存储在hash表中。产生哈希碰撞的话就通过链表去解决。
特点:
- Hash只能用于对等比较,不支持范围查询。
- 无法利用索引完成排序操作
- 查询效率高,在不出现哈希碰撞的情况下通常只需要一次检索。
在MySQL中,Memory引擎支持hash索引,InnoDB具有自适应的hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。
三、索引分类
分类 | 含义 | 特点 | 关键字 |
---|---|---|---|
主键索引 | 对于表中主键创建的索引 | 默认创建,只能有一个 | primary |
唯一索引 | 避免同一张表中列数据值重复 | 可以有多个 | unique |
常规索引 | 快速定位特定数据 | 可以有多个 | |
全文索引 | 快速查找文本中的关键字 | 可以有多个 | fulltext |
在InnoDB中,索引可以分为下面两类
分类 | 含义 | 特点 |
---|---|---|
聚集索引 | 将数据和索引放到一起,索引结构的叶子结点保存了行数据 | 必须,只能有一个 |
二级索引 | 将数据和索引分开来,索引结构的叶子结点管理的是对应的主键 | 可以存在多个 |
聚集索引选取规则:
默认主键为聚集索引。
如果不存在主键,将第一个唯一索引作为聚集索引。
如果没有主键也没有唯一索引,则InnoDB会自动生成一个rowid作为隐藏的经济适用。
二级索引查询:先通过二级索引查到对应的主键,再通过主键回表查询聚集索引保存的行数据
四、索引语法
创建索引
1 | create [unique|fulltext]index index_name on table_name (index_col_name...); |
查看索引
1 | show index table_name; |
删除索引
1 | drop index index_name ont table_name; |
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果