btree索引和hash索引

索引类型

 btree索引和hash索引

1.hash索引(存在内存中)

在memory表默认是hash索引的理论查询时间复杂度为O(1)

疑问:既然hash的查找如此高效,为什么不用hash索引

答:

1).hash函数计算后的结果,是随机的,结果是在磁盘上随机放置

2).无法对范围查询进行优化

3).无法利用前缀索引,比如在btree中,比如查询helloword的hello前缀就无法用左前缀索引

4).排序无法优化

5).通过索引拿到数据的位置,必须回到数据表拿数据

2.myisam,innodb中默认用b-tree索引

b-tree系统,可理解为’排序好的快速查询结构’

b-tree索引误区

 在where常用的列上都加索引

例如where category=1 and price>100 //查询第一个栏目价格100元以上的

误区: category和price都加上索引, 只能在category和price其中一个索引,因为是独立索引,同时只能用1个。

实际上更多使用联合索引

联合索引需符合左前缀原则

以index(a,b,c)为例(注意和顺序有关)联合索引遵循左前缀原则,只有左边的索引发挥了作用,其后的索引才有效

以下表格为例

语句

索引是否发挥作用

where a=3

是,只是用了a列

where a=3 and b=b

是,使用了a,b列

where a=3 and b=5 and c=4

是,使用了abc

where b=3 or c=4

where a=3 and c=4

a列能发挥索引,c不能

where a=3 and b like ‘xxx%’ and c= 7

a,b索引有效,c无效

猜你喜欢

转载自blog.csdn.net/sinat_14826983/article/details/81505312