先来一道经典的服务端面试题,看下你会吗
“如果有这样一个查询select*fromtablewherea=1groupbyborderbyc;如果每个字段都有一个单列索引,索引会生效吗?如果是复合索引,能说下几种情况吗?
本篇文章是MySQL索引的全面知识梳理,包括索引的基础概念、B树结构、索引原理以及一些索引策略的知识。
一、索引基础回顾索引是什么MYSQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,所以说索引的本质是:数据结构
索引的目的在于提高查询效率,可以类比字典、火车站的车次表、图书的目录等。
可以简单的理解为“排好序的快速查找数据结构”,数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
常见的索引模型其实有很多,哈希表、有序数组,各种搜索树都可以实现索引结构
下图是一种可能的索引方式示例(二叉搜索树),左边是一张简单的学生成绩表,只有学号id和成绩score两列(最左边的是数据的物理地址)。
????想要快速查指定成绩的学生,通过构建一个右边的二叉搜索树当索引,索引节点就是成绩数据,节点指向对应数据记录物理地址的指针,就可以运用二叉查找在一定的复杂度内获取到对应的数据,从而快速检索出符合条件的学生信息。
索引本身也很大,不可能全部存储在内存中,一般以索引文件的形式存储在磁盘上
优势索引大大减少了服务器需要扫描的数据量(提高数据检索效率);索引可以帮助服务器避免排序和临时表(降低数据排序的成本,降低CPU消耗);索引可以将随机I/O变为顺序I/O(降低数据库IO成本);劣势索引也是一张表,保存了主键和索引字段,并指向实体表的记录,也需要占用内存;虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息索引分类下边是