关于mysql的索引有三种,fulltext,hash,btree,第一个fulltext只有在MYISAM上支持,这个是针对大量的数据写入表的,用来结局模糊查询因为数据量增加而效率变的底下的问题,这个所以借鉴了分词特性;
第二个hash,使用的是给建立索引的属性建立相应的哈希表,然后在查询的时候通过哈希表的特性来提高查询速度;
第三个是b树,采用的是二叉树式存储该属性的索引;
第二种和第三种的区别在于两个的算法不同,相当于数组和二叉树说的区别,当然哈希表和数组有一定区别;
我创建了个表ja,里面有三个属性,id,name,age,一共有五万条,然后对age,id分别建立了btree,hash的索引;
建立相对的junit,使用jdbc来测试其查询速度,第一次,查询第30000条,使用btree索引,和hash;第二次使用查第30000条以后的记录,是个范围值,结果如下精准hash
精准btree
范围hash
范围btree
如图,可见,btree更适合范围查询,hash适合等值查询;
当然hash算法因为hashcode的原因,当hashcode大量重复时,就会降低其查询效率,因为相同的hashcode的元素使用遍历查询的,还有范围查询时它的hashcode应对范围确认不存在优势;
btree则刚好可以在范围确定中有一定优势,因为btree个节点都是有序的,对于范围确定可以加快速度,但是对于等值,虽然也有优化,但是在hashcode重复较少的情况下btree等值查询没有索引快;