热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mysql目前主要有以下几种索引方式

Mysql目前主要有以下几种索引方式:FULLTEXT,HASH,BTREE,RTREE。那么,这几种索引有什

Mysql目前主要有以下几种索引方式:FULLTEXT,HASH,BTREE,RTREE

那么,这几种索引有什么功能和性能上的不同呢?

FULLTEXT

即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHARVARCHAR ,TEXT 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE INDEX创建FULLTEXT索引,要比先为一张表建立FULLTEXT然后再将数据写入的速度快很多。

全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。在没有全文索引之前,这样一个查询语句是要进行遍历数据表操作的,可见,在数据量较大时是极其的耗时的,如果没有异步IO处理,进程将被挟持,很浪费时间,当然这里不对异步IO作进一步讲解,想了解的童鞋,自行谷哥。

全文索引的使用方法并不复杂:

创建ALTER TABLE table ADD INDEX `FULLINDEX` USING FULLTEXT(`cname1`[,cname2…]);

使用SELECT * FROM table WHERE MATCH(cname1[,cname2…]) AGAINST ('word' MODE );

其中, MODE为搜寻方式(IN BOOLEAN MODE ,IN NATURAL LANGUAGE MODE ,IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION)。

关于这三种搜寻方式,在这里也不多做交代,简单地说,就是,布尔模式,允许word里含一些特殊字符用于标记一些具体的要求,如+表示一定要有,-表示一定没有,*表示通用匹配符,是不是想起了正则,类似吧;自然语言模式,就是简单的单词匹配;含表达式的自然语言模式,就是先用自然语言模式处理,对返回的结果,再进行表达式匹配。

对搜索引擎稍微有点了解的同学,肯定知道分词这个概念,FULLTEXT索引也是按照分词原理建立索引的。西文中,大部分为字母文字,分词可以很方便的按照空格进行分割。但很明显,中文不能按照这种方式进行分词。那又怎么办呢?这个向大家介绍一个Mysql的中文分词插件Mysqlcft,有了它,就可以对中文进行分词,想了解的同学请移步Mysqlcft,当然还有其他的分词插件可以使用。

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的路 MySQLbtree索引和hash索引的区别

&#xff08;1&#xff09;Hash 索引仅仅能满足"&#61;","IN""<&#61;>"查询&#xff0c;不能使用范围查询。 
由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值&#xff0c;所以它只能用于等值的过滤&#xff0c;不能用于基于范围的过滤&#xff0c;因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系&#xff0c;并不能保证和Hash运算前完全一样。 
&#xff08;2&#xff09;Hash 索引无法被用来避免数据的排序操作。 
由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值&#xff0c;而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样&#xff0c;所以数据库无法利用索引的数据来避免任何排序运算&#xff1b; 
&#xff08;3&#xff09;Hash 索引不能利用部分索引键查询。 
对于组合索引&#xff0c;Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值&#xff0c;而不是单独计算Hash 值&#xff0c;所以通过组合索引的前面一个或几个索引键进行查询的时候&#xff0c;Hash 索引也无法被利用。 
&#xff08;4&#xff09;Hash 索引在任何时候都不能避免表扫描。 
前面已经知道&#xff0c;Hash 索引是将索引键通过 Hash 运算之后&#xff0c;将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中&#xff0c;由于不同索引键存在相同 Hash 值&#xff0c;所以即使取满足某个 Hash 键值的数据的记录条数&#xff0c;也无法从 Hash 索引中直接完成查询&#xff0c;还是要通过访问表中的实际数据进行相应的比较&#xff0c;并得到相应的结果。 
&#xff08;5&#xff09;Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。 
对于选择性比较低的索引键&#xff0c;如果创建 Hash 索引&#xff0c;那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦&#xff0c;会浪费多次表数据的访问&#xff0c;而造成整体性能低下。

 

我稍作补充&#xff0c;讲一下HASH索引的过程&#xff0c;顺便解释下上面的第4,5条&#xff1a;

当我们为某一列或某几列建立hash索引时&#xff08;目前就只有MEMORY引擎显式地支持这种索引&#xff09;&#xff0c;会在硬盘上生成类似如下的文件&#xff1a;


hash 

存储地址    

1db54bc745a1

77#45b5 

4bca452157d4

76#4556,77#45cc…

hash值即为通过特定算法由指定列数据计算出来&#xff0c;磁盘地址即为所在数据行存储在硬盘上的地址&#xff08;也有可能是其他存储地址&#xff0c;其实MEMORY会将hash表导入内存&#xff09;。

这样&#xff0c;当我们进行WHERE age &#61; 18 时&#xff0c;会将18通过相同的算法计算出一个hash&#61;&#61;>hash表中找到对应的储存地址&#61;&#61;>根据存储地址取得数据。

所以&#xff0c;每次查询时都要遍历hash表&#xff0c;直到找到对应的hash值&#xff0c;如&#xff08;4&#xff09;&#xff0c;数据量大了之后&#xff0c;hash表也会变得庞大起来&#xff0c;性能下降&#xff0c;遍历耗时增加&#xff0c;如&#xff08;5&#xff09;。

BTREE

BTREE索引就是一种将索引值按一定的算法&#xff0c;存入一个树形的数据结构中&#xff0c;相信学过数据结构的童鞋都对当初学习二叉树这种数据结构的经历记忆犹新&#xff0c;反正我当时为了软考可是被这玩意儿好好地折腾了一番&#xff0c;不过那次考试好像没怎么考这个。如二叉树一样&#xff0c;每次查询都是从树的入口root开始&#xff0c;依次遍历node&#xff0c;获取leaf

BTREEMyISAM里的形式和Innodb稍有不同

 Innodb里&#xff0c;有两种形态&#xff1a;一是primary key形态&#xff0c;其leaf node里存放的是数据&#xff0c;而且不仅存放了索引键的数据&#xff0c;还存放了其他字段的数据。二是secondary index&#xff0c;其leaf node和普通的BTREE差不多&#xff0c;只是还存放了指向主键的信息.

而在MyISAM里&#xff0c;主键和其他的并没有太大区别。不过和Innodb不太一样的地方是在MyISAM里&#xff0c;leaf node里存放的不是主键的信息&#xff0c;而是指向数据文件里的对应数据行的信息.

RTREE

RTREEmysql很少使用&#xff0c;仅支持geometry数据类型&#xff0c;支持该类型的存储引擎只有MyISAMBDbInnoDbNDbArchive几种。

相对于BTREE&#xff0c;RTREE的优势在于范围查找.

各种索引的使用情况

&#xff08;1&#xff09;对于BTREE这种Mysql默认的索引方式&#xff0c;具有普遍的适用性

&#xff08;2&#xff09;由于FULLTEXT对中文支持不是很好&#xff0c;在没有插件的情况下&#xff0c;最好不要使用。其实&#xff0c;一些小的博客应用&#xff0c;只需要在数据采集时&#xff0c;为其建立关键字列表&#xff0c;通过关键字索引&#xff0c;也是一个不错的方法&#xff0c;至少我是经常这么做的。

&#xff08;3&#xff09;对于一些搜索引擎级别的应用来说&#xff0c;FULLTEXT同样不是一个好的处理方法&#xff0c;Mysql的全文索引建立的文件还是比较大的&#xff0c;而且效率不是很高&#xff0c;即便是使用了中文分词插件&#xff0c;对中文分词支持也只是一般。真要碰到这种问题&#xff0c;ApacheLucene或许是你的选择。

&#xff08;4&#xff09;正是因为hash表在处理较小数据量时具有无可比拟的素的优势&#xff0c;所以hash索引很适合做缓存&#xff08;内存数据库&#xff09;。如mysql数据库的内存版本Memsql&#xff0c;使用量很广泛的缓存工具Mencached&#xff0c;NoSql数据库redis等&#xff0c;都使用了hash索引这种形式。当然&#xff0c;不想学习这些东西的话MysqlMEMORY引擎也是可以满足这种需求的。

 

&#xff08;5&#xff09;至于RTREE&#xff0c;至今还没有使用过&#xff0c;它具体怎么样&#xff0c;我就不知道了。有RTREE使用经历的同学&#xff0c;到时可以交流下&#xff01;


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了StartingzookeeperFAILEDTOSTART相关的知识,希望对你有一定的参考价值。下载路径:https://ar ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有