官方定义:
索引是帮助mysql高效获取数据的数据结构,索引的本质是数据结构。
在数据库之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,
这样就可以在这些数据结构上实现高级查找算法,这种数据结构就死索引(所使用的算法是B树算法)
为了加快Col2的查找,可以维护一个二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,
这样就可以运用二叉树找在一定复杂度呢人获取到相应数据,从而快速的检索出符合条件的记录。
索引本身也很大,不可能全部存储在内存中,因此所有往往以索引文件的形式存储在磁盘上,
索引多指B树(多路搜索树,不一定 是二叉树)的结构。
优势:类似图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本,通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
劣势:索引实际上也是一张表,该表保存了主键与索引字段,并指向实体表的记录,索引虽然会大大提高查询速度,同时却会
降低更新表的速度,如对表进行insert,update,delete,因为表更新时,mysql不仅要保存数据,还有保存索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息
索引的目的在于提高效率,可以类比字典,如果要查 Mysql,没有索引时,需要a-z查找,如果有索引,
索引可以将数据排好序,然后查找。
1,索引查找算法:
首先根据给定的索引值K1,在索引表上查找出索引值等于K1的索引项,以确定对应子表在主表中的开始位置和长度,然后再根据给
定的关键字K2,在对应的子表中查找出关键字等于K2的元素。
1,分块查找:
分块查找属于索引查找,其对应的索引表为稀疏索引,具体地说,分块查找要求主表中每个子表(又称为块)之间是递增
(或递减)有序的。即前块中最大关键字必须小于后块中的最小关键字,但块内元素的排列可无序。它还要求索引值域为每块中的最大关键字。
索引分类:
单值索引,一个索引只包含单个列,一个叫表可以有多个单列索引
唯一索引,索引列的值必须唯一,但允许空值
复合索引,一个索引包含多个列
BTree索引结构:
查找过程:
若没有索引则需要很多次IO。
哪些情况需要创建索引:
1,主键自动建立唯一索引
2,频繁作为查询条件的字段
3,查询中与其他表关联的字段,外键关系建立索引
4,频繁更新的字段不适合创建索引
5,where条件里用不到的字段不创建索引
6,高并发下倾向创建组合索引
7,查询中排序的字段,排序字段若通过索引取访问将大大提高排序速度
8,查询中统计或者分组字段
9,如果某个数据列包含许多重复的内容,建立索引就没有太大的效果