MySql-索引

一、索引的本质

没有索引的sql是没有灵魂的,查询速度是非常慢的。

本质:索引是帮助MySql快速获取数据排好序数据结构

二、 索引数据结构:

二叉树 :层级太高,自增主键索引甚至退化成了链表

红黑树 :红黑树是平衡二叉树的一种,相对于二叉树好点,但是当数据大时,层级还是很高,查询速度慢。

Hash表

B-Tree :

1.叶节点具有相同的 深度,叶节点的指针为空

2.所有索引元素不重复

3.节点中的数据索引从左到右递增排序

MySql-索引

 

 

B+-Tree :B-Tree变种

1.非叶子节点不存储data,只储存索引(冗余),可以放更多的索引

2.叶子节点包含所有索引字段

3.叶子节点用指针连接,提高区间访问的性能

MySql-索引

 

 

三、存储引擎索引

下面根据两个存储引擎所有进行下分析:MyISAM存储引擎索引、InnoDB存储引擎索引

MyISAM存储引擎索引:

MyISAM索引文件和数据文件是分离的(非聚集)

MySql-索引

 

 

InnoDB索引实现(聚集)

1.表数据文件本身就是按B+Tree组织的一个索引结构文件

2.聚集索引-叶节点包含了完整的数据记录

 

MySql-索引 MySql-索引

 

 

问题1:为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?

如果不主动为InnoDB表建立主键,sql会去找该表中不具有重复数据的列作为唯一导航,如找不到不重复的列,sql则会自动创建一个隐士的列作为唯一导航。性能会降低。

整形比对大小时速度快,如果用字符串比较大小可能会从头部比较到尾部,占空间和性能也会很大

 

问题2:为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

InnoDB索引的工作原理是:根据非主键索引查询时,先根据非主键索引查询到子节点获取到该主键索引,再根据主键索引查询到目标数据。保证了索引的一致性、节省了存储空间。

 

MySql-索引

上一篇:查询Sqlserver数据库死锁的一个存储过程


下一篇:16.mysql锁