当表中的数据不多的时候,查询的频率比较低的情况下索引的作用还不是太明显,因为这个时候表中的数据差不多会完全缓存到内存中,所以就算是进行全表扫描也不会太慢。但是当数据量太大,内存不能完全缓存所有数据的时候,所以的作用就会显得越来越重要。
Mysql 所支持的索引类型,索引的是在mysql的存储引擎层实现的 不是在mysql服务器层实现的,所以,不用的存储引擎支持不同的索引。
1.B-tree是常见的索引实现,通常都是b+tree来实现,他的特点:
1.它是一种平衡的查找树,
2.每一个叶子到根部的距离都是相同的
3.所有的数据都是按照键值的大小来顺序存放的
4.各个叶子节点通过指针来进行链接,这样可以加快查找的效率。
2.什么情况下适合使用B树索引:
对于第一条的解释,在order_sn字段上建立B树索引,那么这样全职匹配的时候就可以走到索引
第二条,如果建立联合索引(order_sn,create_date),只要联合索引的第一列符合查询条件,这个索引就会被用到,联合索引的第二列符合条件,这样是无法走到这个索引的。这就叫最左匹配前缀的一种查询.
点三条这样的模糊查询,也可以利用到第二条建立的那个联合索引。注意必须是order_sn列开头的索引。
根据b-tree的特点,他更适合范围查找
第二条 如果是联合索引,他可以精确的匹配左前列,并且范围匹配另外一列,例如:order_sn=12212 and create_date>'2021-5-10'
第三条可以用在只访问索引的查询上,这种成为覆盖索引
B树索引除了使用在查询过滤之外呢,还可以使用在order by中,可以只用这种方式来查找到值,同样也可以使用这种方式来排序。
3.B树索引的使用限制:
如果索引命中数据库中的大部分数据时,mysql的优化器会认为可能走全表扫描的效果更好,所以就不会使用索引的方式来进行查询。
假如我们创建了一个索引(A,B,C)相当于创建了三个索引:(A),(A,B),(A,B,C)三个索引。
第一最左匹配规则的解释,如select * from test where B = '1' and A = '2'; 相当于select * from test where A = '2' and B = '1';会走索引(A,B)
第二条的解释,如果查询条件where A = '1' and C = '3';在这当中,只有 A 能使用索引,C 不能使用索引。只会走索引(A)
第三条好理解
第四条,。例如:where A = 'name' and B like 'name%' and C = 'name'; 这里只有 A,B 能使用索引,C不能使用索引。
补充一条:MySQL 能在索引中做最左前缀匹配的 like 比较,但是如果是通配符开头的 like 比较,就不能使用索引。例如:like 'name%' 可以使用索引,like '%name' 则不能使用索引。
4.Hash索引
Hash索引的限制:
5.为什么使用索引