Mysql优化之索引

     Mysql中索引的类型:
  Mysql中的索引分为三种类型:

        1.Normal:该类型的索引对建立索引的字段基本不做特殊要求【唯一性、有序性】
        2.Unique:要求建立索引的字段必须是唯一的;
        3.Full Text:当建立索引的字段是长文本类型等数据长度较长的字段时,建议使用该类型的索引;

 Mysql中索引的方法:
       Mysql中的索引方法有Hash和BTree两种:

       Hash索引方法:

Hash图解

       Hash 索引的缺点:

(1)Hash 索引仅仅能满足”=”,”IN”和”<=>”查询,不能使用范围查询。

由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。

(2)Hash 索引无法被用来避免数据的排序操作。

由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;

(3)Hash 索引不能利用部分索引键查询。

对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。

(4)Hash 索引在任何时候都不能避免表扫描。

前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。

(5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。
2.BTree:
二叉查找树

二叉搜索树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树:

  1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

  2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

  3. 任意节点的左、右子树也分别为二叉查找树。

  4. 没有键值相等的节点。

这里写图片描述

总结:两种索引方法的最终目的都是通过减少查询次数增加了查询的效率,最终达到了数据库优化的效果,但两者都在一定程度上增加了数据库的系统开销,或是内存上的,或是执行效率撒谎那个的。


Reprint please specify: Blog4Jun Mysql优化之索引

Previous
MySQL优化之------索引原理 MySQL优化之------索引原理
最近大佬优化了一条SQL,讲100万条的数据查询速度从27s降低到了0.8S,因此研究了下MySQL优化的原理和方式。下面将从Mysql中索引的本质,原理等方面介绍下MySQL中的索引原理。 1、MySQL中数据的存储方式; mys
2018-12-04 Pursue
Next
mybatis中#{}【占位符】和${}【字符串】拼接的区别 mybatis中#{}【占位符】和${}【字符串】拼接的区别
#{} 表示一个占位符号,通过#{}可以实现 preparedStatement 向占 位符中设置值, 自动进行 java类型和 jdbc 类型转换。#{}可以有效防止 sql 注入。 #{}可以接 收简单类型值或 pojo
2018-12-04 Pursue