Mysql索引
Mysql索引的介绍
索引(index)是帮助Mysql高效获取数据的有序数据结构。
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样,就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
索引的优缺点:
- 优点:
① 极大提升数据查找效率,降低数据库的IO成本;
② 通过索引对数据进行排序,降低数据排序成本,降低CPU消耗。 - 缺点:
① 需要额外的空间用于存储索引;
② 会降低表的更新效率:因为索引需要不断维护,保证索引有效,消耗一定的时间成本。
Mysql索引语法
- 创建索引
CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name(index_col_name,....);
- 查看索引
SHOW INEX FROM table_name;
- 删除索引
DROP INDEX index_name ON table_name;
索引的类型
索引是在数据库的存储引擎层实现的,所以不同的引擎,索引的实现并非一样,主要包含以下几种:
- B+Tree索引,最常见的索引类型,大部分引擎都支持B+Tree索引;
- Hash索引,使用哈希表实现,只有精确匹配索引列的查询才有效,不支持范围查询;
- R-Tree(空间索引),是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常较少使用;
- Full-text(全文索引),是一种通过建立倒排序索引,快速匹配文档的方式,类似于Lucene,Solr,Es。
-
B树结构示意图
-
B+树结构示意图
-
Mysql索引结构示意图
Mysql索引数据对传统B+Tree进行了优化,增加了一个指向相邻叶子结点的链表指针,形成了带有序指针的B+Tree,提高区间访问性能
-
hash索引
hash索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。
如果两个(或多个)键值,映射到同一个槽位上,它们就产生了hash冲突(也称hash碰撞),可以通过链表来解决。
hash索引存储引擎支持:Mysql中支持hash索引的是Memory引擎,而InnoDB中具有自适应hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。 -
hash索引的特点
①hash索引智能用于对等比较(=,in),不支持范围查询(between,>,<,…);
②无法利用索引完成排序操作;
③查询效率高,通常只需要一次检索即可,效率通常高于B+Tree索引。
思考: 为什么InnoDB引擎选择使用B+Tree索引结构?
① B+Tree查找效率高,时间复杂度为Ologn
② 在Mysql中,一个结点存一个页,页的最大储存16K数据,而B+Tree的根节点只存索引数据,相对于BTree,B+Tree在一页中可以存放更多的数据,树的层级将会更少。这样一来则可以极大地利用磁盘IO缓存,减少磁盘IO次数,加快数据查找效率;
③ B+Tree支持范围查询。
索引的分类
- InnoDB引擎,根据索引的存储形式可分为两类:
- 聚集索引和二级索引执行SQL语句视图
- 二级索引的工作原理:
①通过二级索引找到对应主键值;
②通过主键值搜索聚集索引拿到具体的行数据。
图片来源于互联网,笔记仅供学习使用,如若文中描述错误,敬请指导。