mysql索引加速怎么查 mysql索引如何加快查询( 二 )


对搜索引擎稍微有点了解的同学,肯定知道分词这个概念 , FULLTEXT索引也是按照分词原理建立索引的 。西文中 , 大部分为字母文字 , 分词可以很方便的按照空格进行分割 。但很明显,中文不能按照这种方式进行分词 。那又怎么办呢?这个向大家介绍一个Mysql的中文分词插件Mysqlcft,有了它,就可以对中文进行分词 , 想了解的同学请移步Mysqlcft,当然还有其他的分词插件可以使用 。
【mysql索引加速怎么查 mysql索引如何加快查询】HASH
Hash这个词,可以说,自打我们开始码的那一天起,就开始不停地见到和使用到了 。其实 , hash就是一种(key=value)形式的键值对,如数学中的函数映射,允许多个key对应相同的value,但不允许一个key对应多个value 。正是由于这个特性,hash很适合做索引,为某一列或几列建立hash索引,就会利用这一列或几列的值通过一定的算法计算出一个hash值,对应一行或几行数据(这里在概念上和函数映射有区别,不要混淆) 。在Java语言中,每个类都有自己的hashcode()方法,没有显示定义的都继承自object类,该方法使得每一个对象都是唯一的,在进行对象间equal比较 , 和序列化传输中起到了很重要的作用 。hash的生成方法有很多种,足可以保证hash码的唯一性,例如在MongoDB中,每一个document都有系统为其生成的唯一的objectID(包含时间戳,主机散列值,进程PID,和自增ID)也是一种hash的表现 。额,我好像扯远了-_-!
由于hash索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率 。那为什么还需要其他的树形索引呢?
在这里愚安就不自己总结了 。引用下园子里其他大神的文章:来自 14的路 的MySQL的btree索引和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 值相关联 。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下 。
愚安我稍作补充 , 讲一下HASH索引的过程,顺便解释下上面的第4,5条:
当我们为某一列或某几列建立hash索引时(目前就只有MEMORY引擎显式地支持这种索引),会在硬盘上生成类似如下的文件:

推荐阅读