索引是什么
mysql官方定义:
索引(index)是帮助mysql高效获取数据的数据结构。
所以索引的本质:索引是数据结构
详细解释:
在数据之外,==数据库系统还维护这满足特定查找算法的数据结构==,这些数据结构以某种方式引用(指向)数据,这样就可以在数据结构上实现高效查找算法。
给出一种可能的索引方式示例:
索引示例.png为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点没被包含索引键值和一个指向对应数据记录物理地址的指针,这样就能加快查找速度。(以后一说到索引,脑海中就跳出这张图)
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上,需要的时候才加载到内存中
索引的结构
我们平常所说的索引,如果没有特别说明,都是指BTree(多路搜索树,并不一定是二叉树)结构组织的索引。其中聚集索引、次要索引、复合索引、前缀索引、唯一索引默认都是B+树索引,统称索引。当然,除了B+树这种索引之外,还有哈希索引(hash index)等。
作为程序员,我们只需要了解BTree索引就够了;后面我会专门写篇介绍BTree索引;这里就先过个眼熟
索引的优点
- 通过索引查找,提高了数据检索的效率,降低数据库的IO成本
- 通过索引排序,降低数据排序的成本,提高了效率
索引的缺点
- 索引也是数据,也是需要占用空间的
- 虽然索引提高了查询速度,同时也会降低更新表的速度,因为更新表时,还要更新索引文件。
- 如果数据量非常大的话,索引的建立与维护的代价就会非常大。
索引分类
- 单值索引:即一个索引只包含单个列,一个表可以有多个单列索引
- 唯一索引:索引列的值必须唯一,但允许有空值
- 复合索引:即一个索引包含多个列
哪些情况需要创建索引
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其它表关联的字段,外键关系建立索引
- where条件里用不到的字段不创建索引
- 单键/组合索引选择问题(在高并发下倾向创建组合索引)
- 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
- 查询中统计或分组的字段
不需要建索引
- 表记录太少
- 经常增删改的表
- 数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据列建立索引。如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
网友评论