mysql索引 B+tree

时间:2021-01-16 15:27:40

一、B+tree示意图

mysql索引 B+tree

二、为什么要用索引

1、索引能极大减少存储引擎需要扫描的数据量:因为索引有序所以可以快速查找并且不用全表查找;

2、索引可以把随机IO变为顺序IO:因为B+tree在数据中保存了下个数据的信息;

3、索引在分组、排序等操作时,不使用临时表。

三、sql数据库优化

1、索引列数数据长度能少则少:数据也是分片的,一次可以加载回更多数据,减少磁盘io;

2、索引不是越多越好,越全越好:只要设计索引字段修改、插入就需要调整B+tree,会降低写效率;

3、匹配列前缀可用到索引:如 like 9999%可以利用索引,但%9999%用不到索引,因为用的是tree所以前边%不知道该往那个方向遍历;

4、where条件中 not in 和 <>操作无法使用索引:原因如3;

5、匹配范围值 order by 、group by也可用到索引:因为B+tree为有序存储在数据中保存了下个数据的信息;

6、少用select *,应该指定列:因为B+tree所有数据地址都在最末一层如果需要所有数据必须找到最末层才能拿到,如果你要返回的字段正好是索引字段那只要遍历key(关键字)即可;

7、索引列不能使用表达式或函数:原因如3;

8、对于过长字符串创建索引可以通过创建前缀索引,注意前缀需要选择好的离散型:就是指对数据的一部分创建索引;

9、联合索引中如果不是按照索引最左列开始查找,无法使用索引;

10、联合索引中精确匹配最左列并范围匹配另外一列可以用到索引;

11、联合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引。