什么是索引?
索引用一句话概括就是将无序的数据变为有序。可以快速地寻找具有特定值的记录,如果不使用索引。查询时将会遍历整张表。可以理解为索引相当于书的目录,有了目录,我们可以直接定位到我们想查找的内容。
索引的原理?
- 把创建了索引的列内容进行排序
- 将排序的结果生成为倒排表
- 在倒排表上拼接对应的数据地址链
- 查询时,先获取倒排表,取出对应的数据地址链。返回数据
索引的设计原则?
- 出现在where中的字段最好加上索引
- 主键和外键的数据列必须加上索引
- 一般建立在小字段上,对于文本字段不建立索引
- 经常出现在ORDER BY,GROUP BY,DISTINCT后面的字段,建立索引
- 不要建立过多的索引。索引也是需要占据额外的物理空间,并且也需要维护。会影响增删改的效率
- 列有大量的重复数据不要建索引。例如性别,只有男/女。因为Mysql优化器会走全表扫描,相当于建立了一个无效索引。
索引的结构?
B树:
B树是一种多路搜索树,每个节点存储三个元素。key,key对应的数据地址data和指向下一层地址的指针。查询时,从根节点向下查找,知道找到对应的key。
缺点: 查询速度跟树的高度挂钩。树的高度越高,效率越慢。因为每向下查询一层,就相当于做了一次I/O操作。磁盘操作效率是很慢的。
B+树:
是一个平衡多叉树。和B树最大区别有两个,第一个是B+树非叶子节点存储2个数据,key和指向下一层的指针。叶子节点存储地址链。叶子节点之间通过双向指针连接。构成一个有序链表。第二个是B+树只有在叶子节点才命中
Hash:
底层是哈希表。使用哈希算法将键换算为hash值,存储到对应的位置。查询单个数据最快。只适合等值查询
缺点: 不支持范围查询,不支持索引值的排序操作,不支持联合索引的最左匹配
索引分类?
主键索引: 创建主键的索引,只能有一个,不允许为NULL
唯一索引: 索引值的列必须唯一,可以有多个唯一索引。允许多个NULL
普通索引: 单个列的索引,可以创建多个
全文索引: 匹配文本中的关键字,可以有多个。5.6之前只有MyIsam支持全文索引。5.6之后InnoDB也支持全文索引
联合索引: 一个索引包含多个列,使用时需要满足最左原则
聚簇索引和非聚簇索引?
聚簇索引: 不是一种索引类型,而是一种存储数据的数据结构。只有InnoDB的主键索引才是聚簇索引。将数据和索引存放在一起。找到索引也就找到了数据。插入速度受主键的顺序影响。如果主键是自增的则插入速度最快
非聚簇索引: 索引和数据是分开的。第一次找到主键值,第二次根据主键值找到行数据。
更多知识请移步个人博客:33sora.com