1 索引分类
索引可以分为聚簇索引和非聚簇索引
聚簇索引:基于主键创建的索引。或者叫做聚集索引,因为索引和数据是保存在一起的。
非聚簇索引: 除了主键索引之外创建的索引都是非聚簇索引。辅助索引。
2 索引的数据结构
1 hash结构
hash结构是将数据通过key-value的形势存储数据的。这种方式存储数据对于等值查询来说数据非常快,但是不适用于做范围性的数据查找。
2 查找二叉树
查找二叉树是将数据通过以二叉树的形式来存放的,左子树的数据必须要小于根节点,右子树的数据必须要大于或者等于根节点。二叉树的方式查找的时间复杂度是log2为底N 为 对数。 但是查找二叉树的缺点就是一旦根节点没有选择好,就会出现左右高度不平衡的现象,极端情况会退化成一个单链表。
3 二叉平衡查找树
二叉平衡查找树要求在查找二叉树的基础之上根节点的左子树与右子树的高度相差必须小于等于1,这样二叉平衡查找树有了查找二叉树的优势。但是二叉平衡查找树随着数据的 不 断增加树的高度也会在不断增加,查找的时间复杂度也在不断的提高。
4 B树
B树是在二叉平衡查找树的基础之上演化而来的一个多叉平衡查找树。这样在二叉平衡查找树的基础之上可以降低树的高度。
5 B+树
B+树是在B数的基础之上演化的,它与B树的区别在于B+数只有叶子节点存储数据,然后所有的叶子节点有一条双向链表链接,根节点只存放索引的值。
更多的索引数据结构详细讲解可以关注我的文章mysql之索引数据结构。
3 组合索引
组合索引就是将多个字段一起创建的索引。实际项目中组合索引用处还是比较多的。
3.1 组合索引的使用方法。如基于某表中的a,b,c三个字段建立索引
3.1 要求查询条件中必须包含组合索引中的第一个字段。
3.2 可以满足根据a, ab, abc查询的时候都可以使用到索引
3.3 如果条件中只有b和c条件的话是无法用到索引的。
3.4 如果条件中只有a和c那么就只有a使用到了索引,c将不会使用到索引。
3.5 索引的列上一旦使用的计算公式,索引也会失效
3.6 索引使用了范围查找,那么范围查找之后的索引列也会失效
3.7 索引字段中使用like,如果like在最左边这该索引列以及其后面的列都会失效。如果在右端,则该列后面的索引字段会失效。
3.8 索引字段中使用了or的话,该列字段及其后面的索引列都会失效。
这就是索引的最左匹配规则
4 创建索引的原则
4.1 经常出现在where条件的字段可以建索引。
4.2 经常出现在order by 和 group by中的字段可以建索引。
4.3 经常出现在select语句中少数字段可以考虑建索引。如 select id, a,b, c from ... 可以考虑a,b,c建索引。原因见:mysql之索引数据结构中详解。
4.4 组合索引的字段先后原则,根据列在sql的条件中出现频率的高低依次排序,频率较高的排到最第一位,最低的排到最后一位。
5 创建优化的建议
1.表记录很少的不需要建索引(索引是要有存储开销的,同时也会影响到insert和update的性能)。
2.一个表的索引不宜太多。 (每个索引都是一颗B+树,索引太多会占用过多的磁盘空间,每次跟新或者插入都要去跟新这些索引的B+树,势必会使得insert和update变慢)
3. 频繁跟新的字段不建议建索引。 频繁跟新的字段,频繁跟新的字段如果建列索引的话,容易出现页裂变和页合并现象,比较消耗DB的性能。
4. 区分度比较低的字段也不推荐建索引。
5, 无序字段不建议做索引。
6, 字段太大不建议建索引。
7,尽量使用组合索引来代替使用多个单字段索引。