mysql:索引
mysql:索引
小吴顶呱呱1.什么是索引
索引(index)是帮助Mysql高效获取数据的数据结构(有序),在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
2.索引的底层数据结构
Mysql默认的底层数据结构是B+树,首先我们先看看二叉树和B树:
二叉搜索树:二叉搜索树可能会退化为链表,时间复杂度从ologn退化到o(n);
如果采用平衡的二叉树,如红黑树:这种情况下如果数据库表的数据量过大,可能会造成树的深度过深,查找效率也不会很高;
B树:B树是一种多叉路平衡查找树,B树每个节点可以有多个分支,即多叉;以一颗最大度数(max-degree)为5(5阶)的B-tree为例,那么B树 的每个节点最多存储4个key:
相较于二叉树,B-tree是一颗矮胖的树,查找效率高。
B+tree:
B+tree是在B-tree基础上的一种优化,使其跟适合实现外存储索引结构,InnoDB存储引擎就是使用B+tree实现索引结构。
B树和B+树对比:1、磁盘读写代价B+树更低;2、查找效率B+树更加稳定;3、B+树便于扫库和区间查找
3.聚簇索引和非聚簇索引
- 聚簇索引又称聚集索引,是将数据存储和索引放到一块,索引结构的叶子结点保存了行数据;主键一定是聚簇索引,有且必须有一个聚簇索引。
- 非聚簇索引又称二级索引,是将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键;
聚集索引的选取规则:
- 如果存在主键,则主键是聚集索引
- 不存在主键,则使用第一个唯一(UNIQUE)索引作为聚集索引
- 如果表中没有主键,也没有唯一值,则Innodb会自动生成一个rowId作为隐藏的聚集索引
4.回表查询
先通过二级索引找到主键值,再去聚集所以中根据主键值查找数据:
5.覆盖索引
简单来说,覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中全部能够找到。或者说不需要回表查询的就是覆盖索引。
6.索引创建原则
- 数据量比较大,且查询比较频繁的表
- 常常作为查询条件,排序,分组的字段
- 字段内容区分度高
- 内容较长,使用前缀索引
- 尽量使用联合索引
- 要控制索引的数量
- 如果索引列不能存储null值,请在创建表时使用Not Null约束它
7.索引失效情况
-
违反了最左前缀法则:如果索引了多列,要遵守最左前缀法则,值得是查询从索引的最左前列开始,并且不跳过索引中的列。匹配最左前缀法则,则走索引。
-
范围查询右边的列,不能使用索引。
-
不要在索引列上进行运算操作,会导致索引失效。
-
字符串不加单引号,造成索引失效,因为不加引号,会发生类型的自动转换,造成索引失效。
-
以%开头的Like模糊查询,有可能会造成索引失效。如果是尾部模糊查询,则不会造成索引失效。