关于mysql的索引有三种,fulltext,hash,btree,第一个fulltext只有在MYISAM上支持,这个是针对大量的数据写入表的,用来结局模糊查询因为数据量增加而效率变的底下的问题,这个所以借鉴了分词特性;

第二个hash,使用的是给建立索引的属性建立相应的哈希表,然后在查询的时候通过哈希表的特性来提高查询速度;

第三个是b树,采用的是二叉树式存储该属性的索引;

第二种和第三种的区别在于两个的算法不同,相当于数组和二叉树说的区别,当然哈希表和数组有一定区别;

我创建了个表ja,里面有三个属性,id,name,age,一共有五万条,然后对age,id分别建立了btree,hash的索引;

建立相对的junit,使用jdbc来测试其查询速度,第一次,查询第30000条,使用btree索引,和hash;第二次使用查第30000条以后的记录,是个范围值,结果如下mysql的索引精准hash

mysql的索引精准btree

mysql的索引范围hash

mysql的索引范围btree

如图,可见,btree更适合范围查询,hash适合等值查询;

当然hash算法因为hashcode的原因,当hashcode大量重复时,就会降低其查询效率,因为相同的hashcode的元素使用遍历查询的,还有范围查询时它的hashcode应对范围确认不存在优势;

btree则刚好可以在范围确定中有一定优势,因为btree个节点都是有序的,对于范围确定可以加快速度,但是对于等值,虽然也有优化,但是在hashcode重复较少的情况下btree等值查询没有索引快;

相关文章: