已解决问题
谷歌zhuimenglove0用户在2018.01.14提交了关于“决战朝鲜mysql索引有几种”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2024-08-31T23:55:32。希望大家能够帮助她。详细问题描述及疑问:期待您的答案,没有什么华丽的语言,但是我对你的感谢不会减少 !
详细问题描述及疑问:期待您的答案,没有什么华丽的语言,但是我对你的感谢不会减少 !
Mysql目前主要有以下几种索引类型:FULLTEXT,h**AS
那么,这几种索引有什
FULLTEXT
即为全文索引,目前只有MyISA
全文索引并不是和MyI
全文索引的使用方法并不复杂:
创建ALTERTAB
使用**LECT*FROMtableWh**EREMA
其中,MO
关于这三种搜寻方
对搜索引擎稍微
h**ASh**
h**ash这个
由于hash索引可
在这里愚安就不自己总结了。引用下园子里其他大神的文章:来自14的路的MySQL的btree索引和hash索引的区别
(1)h**ash索引仅
由于h**ash索引比较的是进行h**ash运算之后的h**ash值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的h**ash算法处理之后的h**ash值的大小关系,并不能保和h**ash运算前完全一样。
(2)h**ash索引无法被用来避免**的排序操作。
由于h**ash索引中存放的是经过h**ash计算之后的h**ash值,而且h**ash值的大小关系并不一定和h**ash运算前的键值完全一样,所以**库无法利用索引的**来避免任何排序运算;
(3)h**ash索引不能利用部分索引键查询。
对于组合索引,h**ash索引在计算h**ash值的时候是组合索引键合并后再一起计算h**ash值,而不是单独计算h**ash值,所以通过组合索引的前面一个或几个索引键进行查询的时候,h**ash索引也无法被利用。
(4)h**ash索引在任何时候都不能避免表扫描。
前面已经知道,h**ash索引是将索引键通过h**ash运算之后,将h**ash运算结果的h**ash值和所对应的行指针信息存放于一个h**ash表中,由于不同索引键存在相同h**ash值,所以即使取满足某个h**ash键值的**的记录条数,也无法从h**ash索引中直接完成查询,还是要通过访问表中的实际**进行相应的比较,并得到相应的结果。
(5)h**ash索引遇到大量h**ash值相等的情况后性能并不一定就会比B-Tree索引高。
对于选择性比较低的索引键,如果创建h**ash索引,那么将会存在大量记录指针信息存于同一个h**ash值相关联。这样要**某一条记录时就会非常麻烦,会浪费多次表**的访问,而造成整体性能低下。
愚安我稍作补充,讲一下h**ASh**索引的过程,顺便解释下上面的第4,5条:
当我们为某一列或某几列建立hash索引时(目前就只有MEMORY引擎显式地支持这种索引),会在硬盘上生成类似如下的文件:
hash值存储地址
1db54bc745a177#45b5
4bca452157d476#4556,77#45cc…
…
hash值即为通过特定算法由指定列**计算出来,磁盘地址即为所在**行存储在硬盘上的地址(也有可能是其他存储地址,其实MEMORY会将hash表导入内存)。
这样,当我们进行Wh**EREage=18时,会将18通过相同的算法计算出一个hash值==>在hash表中找到对应的储存地址==>根据存储地址取得**。
所以,每次查询时都要遍历hash表,直到找到对应的hash值,如(4),**量大了之后,hash表也会变得庞大起来,性能下降,遍历耗时增加,如(5)。
**REE
**REE索引就是一种将索引值按一定的算法,存入一个树形的**结构中,相信学过**结构的童鞋都对当初学习二叉树这种**结构的经历记忆犹新,反正愚安我当时为了软考可是被这玩意儿好好地折腾了一番,不过那次**好像没怎么考这个。如二叉树一样,每次查询都是从树的入口root开始,依次遍历node,获取leaf。
**REE在MyISAM里的形式和Innodb稍有不同
在Innodb里,有两种形态:一是primarykey形态,其leafnode里存放的是**,而且不仅存放了索引键的**,还存放了其他字段的**。二是secondaryindex,其leafnode和普通的**REE差不多,只是还存放了指向主键的信息.
而在MyISAM里,主键和其他的并没有太大区别。不过和Innodb不太一样的地方是在MyISAM里,leafnode里存放的不是主键的信息,而是指向**文件里的对应**行的信息.
RTREE
RTREE在mysql很少使用,仅支持geometry**类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
相对于**REE,RTREE的优势在于范围查找.
各种索引的使用情况
(1)对于**REE这种Mysql默认的索引类型,具有普遍的适用性
(2)由于FULLTEXT对中文支持不是很好,在没有插件的情况下,最好不要使用。其实,一些小的博客应用,只需要在**采集时,为其建立关键字列表,通过关键字索引,也是一个不错的方法,至少愚安我是经常这么做的。
(3)对于一些搜索引擎级别的应用来说,FULLTEXT同样不是一个好的处理方法,Mysql的全文索引建立的文件还是比较大的,而且效率不是很脯即便是使用了中文分词插件,对中文分词支持也只是一般。真要碰到这种问题,Apache的Lucene或许是你的选择。
(4)正是因为hash表在处理较小**量时具有无可比拟的素的优势,所以hash索引很适合做缓存(内存**库)。如mysql**库的内存版本Memsql,使用量很广泛的缓存工具Mencached,NoSql**库redis等,都使用了hash索引这种形式。当然,不想学习这些东西的话Mysql的MEMORY引擎也是可以满足这种需求的。
(5)至于RTREE,愚安我至今还没有使用过,它具体怎么样,我就不知道了。有RTREE使用经历的同学,到时可以交流下!