mysql怎么加快搜索 mysql 搜索一条数据( 二 )


看到主键索引,索引类型是BTREE(二叉树)
正是因为这个二叉树算法,让查询速度快很多,二叉树的原理,就是取最中间的一个数 , 然后把大于这个数的往右边排,小于这个数的就向左排 , 每次减半,然后依次类推 , 每次减半,形成一个树状结构图
例如上面的例子,我们不使用索引的话 , 需要查询11次才把编号为4的数据取出,如果加上索引,我们只需要4次就可以取出 。
如大家所知道的,MySQL目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE 。
那么,这几种索引有什么功能和性能上的不同呢?
FULLTEXT
即为全文索引,目前只有MyISAM引擎支持 。其可以在CREATE TABLE ,ALTER TABLE,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引 。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE INDEX创建FULLTEXT索引,要比先为一张表建立FULLTEXT然后再将数据写入的速度快很多 。
全文索引并不是和MyISAM一起诞生的,它的出现是为mysql怎么加快搜索了解决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 , 当然还有其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的表现 。额,我好像扯远了-_-!

推荐阅读