索引类型
btree索引和hash索引
1.hash索引(存在内存中)
在memory表默认是hash索引的理论查询时间复杂度为O(1)
疑问:既然hash的查找如此高效,为什么不用hash索引
答:
1).hash函数计算后的结果,是随机的,结果是在磁盘上随机放置
2).无法对范围查询进行优化
3).无法利用前缀索引,比如在btree中,比如查询helloword的hello前缀就无法用左前缀索引
4).排序无法优化
5).通过索引拿到数据的位置,必须回到数据表拿数据
扫描二维码关注公众号,回复:
2910504 查看本文章
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无效 |