什么是索引?
索引是为了提高磁盘I/O效率,因为数据都存储在磁盘上,采用数据结构配合高效的查找方法进行更高效率的查找。
所以索引的本质上可以理解为是一种数据结构,而Mysql默认的存储引擎是InnoDB,所以我们主要关注InnoDB支持的索引--BTree索引。
正常检索数据的时候,从头到尾检索,当数据量一大就很慢了
从二叉树到B+树
普通的排序二叉树搜索是比较慢的,而且当排序顺序插入的时候,这个二叉树的结构会形成一个类似单链表的形式;
后来有了平衡二叉树、红黑树(自平衡二叉树),但是当数据量大的时候,检索速度还是慢,因为层级会较深;
BTree(多路平衡查找树),B树的度可以大于二,所以它的层级较红黑树浅。它的结构大概长这样:这是一个最大度为5(最多存储4个键,5个指针)的B树,指针指向的是在左右两个键中间范围的节点。
B+Tree是在BTree的基础上做了变动,它的数据都存储在叶子节点上,非叶子节点是用来索引的,这样就可以将之前用作存储数据的内存用于存储更多的节点。加快检索的速度。并且叶子节点之间形成一个单向链表。
MySQL索引数据结构对B+Tree进行了优化,在增加了一个指向相邻叶子结点的链表指针,形成了带有顺序指针的B+Tree(双向循环链表),提高区间访问性能。
InnoDB还自适应hash索引,这是InnoDB在发现某个数据高频率被查找时自动生成的。
hash索引是通过hash算法对我们要进行简历索引的字段,进行哈希计算,获得哈希值,那么当我们要通过这个这个字段进行查找的时候就只需要对查找的值进行哈希计算,便能找到对应的数据。时间复杂度通常是O(1)。为什么是通常呢?因为这要建立在没有哈希冲突(哈希碰撞)的情况下,当出现了冲突(两个值计算出来的哈希值一样),就通过单链表的形式,将他们连接起来。
索引的分类
主键索引:针对于主键自动创建的索引,创建表的时候如果有主键那么这个主键将自动创建索引,而且主键索引是最优的。关键字:PRIMARY
唯一索引:避免同一个表中某项数据出现重复,可以有多个。关键字:UNIQUE
普通索引:快速定位特定数据,可以有多个,一般由管理员手动创建的索引。
全文索引:全文索引查找的是文本的关键字,而不是比较索引中的值,可以有多个。关键字:FULLTEXT
在InnoDB存储引擎中,根据存储形式,又分为聚集索引和二级索引。
聚集索引:必须有,而且只有一个,叶子节点放保存数据;默认主键索引就是聚集索引,如果没有主键索引,那么第一个唯一索引作为主键索引,当也没有合适的唯一索引,那么InnoDB会自动生成一个rowid作为隐藏的聚集索引。
二级索引:二级索引将索引和数据分开存储,叶子节点关联检索内容对应的主键,再通过主键索引找到对应的数据;
创建索引:CREATE [UNIQUE/FULLTEXT] INDEX index_name ON table_name (index_col_name,...)
查看索引:SHOW INDEX FROM table_name
删除索引:DROP INDEX index_name ON table_name
索引失效
1:在索引列上进行运算操作
2:字符串不加引号
3:模糊匹配:头部进行模糊匹配索引失效,尾部模糊匹配不会失效
4:使用 or 连接条件时,当 or 前面有索引列,后面没有索引列,那么所有索引都不会生效
5:如果MySQL评估全表扫描比索引更快,那么索引将不会生效