茌平网站开发,php 打开网站,做网站时怎么让边框细一点,网站上图怎么用ps做Mysql索引底层数据结构 一、数据结构1.1.索引的本质1.2.MySQl特点1.3.索引数据结构1.4.B-Tree结构1.5.BTree结构1.6.查看mysql文件页大小#xff08;16K#xff09;1.7.为什么mysql页文件默认16K#xff1f;1.8.Hash结构 二、存储引擎2.1.InnoDB2.1.1.聚集索引2.1.2.为什么建… Mysql索引底层数据结构 一、数据结构1.1.索引的本质1.2.MySQl特点1.3.索引数据结构1.4.B-Tree结构1.5.BTree结构1.6.查看mysql文件页大小16K1.7.为什么mysql页文件默认16K1.8.Hash结构 二、存储引擎2.1.InnoDB2.1.1.聚集索引2.1.2.为什么建议InnoDB表必须建主键并且推荐使用整型的自增主键2.1.3.为什么非主键索引结构叶子节点存储的是主键值(一致性和节省存储空间)2.1.4.二级索引2.1.5.磁盘文件存储表信息2.1.6.查找id18 2.2.MyISAM2.2.1.非聚集索引2.2.2.磁盘文件存储表信息 三、索引最左前缀原理--联合索引endl 一、数据结构
1.1.索引的本质
索引是帮助Mysql高效获取数据的排好序的数据结构
1.2.MySQl特点
查询效率高支持数据量大在千万级以上数据量时也要保持查询的稳定性对范围查询友好
1.3.索引数据结构
- 二叉树
- 红黑树
- B-Tree
- BTree
- Hash表数据结构网址https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
平时我们的插入数据主键都是自增有序的当使用二树树插入数据时树的高度增加会退化成一个链表结构查询效率低。红黑树是颗平衡二叉树解决了二叉树退化成链表结构问题但当数据量过大树的高度增加查询效率逐渐降低。因此树的高度决定了磁盘IO读写的次数也就是查询效率。
1.4.B-Tree结构
优点 叶节点具有相同的深度叶节点的指针为空所有索引元素不重复节点中的数据索引从左到右递增排列 缺点范围查询不友好
1.5.BTree结构
BTree(B-Tree变种) 非叶子节点不存储data只存储索引(冗余)一个节点可以放更多的索引叶子节点包含所有索引字段叶子节点存放所有数据叶子节点使用互相指向指针连接提高区间访问的性能方便进行范围查询从左到右遍历即可查询
1.6.查看mysql文件页大小16K
-- 查看mysql文件页大小16K
SHOW GLOBAL STATUS like Innodb_page_size;1.7.为什么mysql页文件默认16K
假设我们一行数据大小为1K那么一页就能存16条数据也就是一个叶子节点能存16条数据
再看非叶子节点假设主键ID为bigint类型那么长度为8B指针大小在Innodb源码中为6B一共就是14B
那么一页里就可以存储16K/141170个(主键指针)
那么一颗高度为2的B树能存储的数据为1170*1618720条
一颗高度为3的B树能存储的数据为1170*1170*1621902400千万级条千万级数据量的表查询数据也最多只要经历3次IO而且根节点其实常驻在MySQL内存中。1.8.Hash结构
Hash 对索引的key进行一次hash计算就可以定位出数据存储的位置很多时候Hash索引要比B 树索引更高效仅能满足 “”“IN”不支持范围查询hash冲突问题 二、存储引擎
2.1.InnoDB
2.1.1.聚集索引
聚集索引叶子结点存储完整的数据主键索引即数据文件比非聚集索引效率更高减少了一次回表操作。
InnoDB索引实现(聚集) 表数据文件本身就是按BTree组织的一个索引结构文件聚集索引-叶节点包含了完整的数据记录 2.1.2.为什么建议InnoDB表必须建主键并且推荐使用整型的自增主键
首先MySQL会找表中是否有唯一索引如果有就以唯一索引作为主键然后用这一列的数据来组织你这个表的所有数据如果没有唯一索引那么将添加隐藏字段rowid作为主键帮你自动维护这整张表的B数的数据结构整形作为主键相比字符型可以节省数据页的空间构建索引 b 树时为了保证索引的有序性使用整形可以避免页分裂在索引中查找数据时减少比较的性能。因为索引结构 b 树具有有序的特性如果主键不是自增的在进行增删数据的时候会判断数据应该存放的位置进行插入和删除为了保持平衡会对数据页进行分裂等操作移动数据严重影响性能所以主键需要是自增的插入时插入在索引数据页最后。
2.1.3.为什么非主键索引结构叶子节点存储的是主键值(一致性和节省存储空间)
一致性如果二级索引也存储完整的数据假如修改数据需要同时修改主键索引又要修改二级索引数据很繁琐。节省存储空间
2.1.4.二级索引
通过其他字段查询数据比如给age字段建立索引除主键索引之外的索引称为二级索引或者辅助索引二级索引同样是颗B树与主键索引不同点是二级索引的叶子节点并非存储完整的数据而是存储主键节省存储空间二级索引又分为普通索引和唯一索引
2.1.5.磁盘文件存储表信息
table.frm: 表结构文件table.idb: 索引数据文件
CREATE TABLE test_innodb_lock (a int(11) NOT NULL,b varchar(255) DEFAULT NULL,KEY idex_a (a),KEY idex_b (b)
) ENGINEInnoDB DEFAULT CHARSETutf8;2.1.6.查找id18
图中空白部分存储的为下个结点的磁盘地址如根结点[15-56]和[56-77]之间的空白点存储的就是指向最左边子结点的磁盘地址。1、首先将根结点加载到内存中(后续根结点常驻内存)2、二分查找id30的位置定位在15-56之间读取下一个结点的磁盘地址3、加载结点到内存继续二分查找定位在15-20之间读取磁盘地址4、加载叶子结点找到id为18的记录5、如果是通过二级索引查找则继续使用主键回表查找主键索引
2.2.MyISAM
2.2.1.非聚集索引
MyISAM索引文件和数据文件是分离的(非聚集) 非聚集索引叶子结点存储的是指向数据的磁盘地址索引和数据分离。
2.2.2.磁盘文件存储表信息
table.frm: 表结构文件信息table.MYI: 索引文件tbale.MYD: 数据文件
CREATE TABLE test_myisam (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL,PRIMARY KEY (id)
) ENGINEMyISAM AUTO_INCREMENT2 DEFAULT CHARSETutf8;三、索引最左前缀原理–联合索引
联合索引指由多个字段组成的索引如下面nameagepositon构成这样一颗索引树索引同样是从小到大排列先根据第一个字段name排序第一个字段相同时排序第二个字段age以此类推。
endl