MySql数据存储位置以及索引

您所在的位置:网站首页 mysql数据库的数据存储在哪里 MySql数据存储位置以及索引

MySql数据存储位置以及索引

2024-01-12 09:06| 来源: 网络整理| 查看: 265

MySql安装目录 data:data里面每一个文件对应这个一个数据库实例,每一个数据库实例存放着这个实例的数据库表 MySql的存储引擎 MyISAM存储引擎:

根据下图我们可以发现如果表设计用的是MyISAM存储引擎的话,它的表结构、数据、以及索引是分三个文件存储的,如果我们根据一个索引字段去查询数据的话,它会先去MYI文件根据B+trees索引结构从根节点开始遍历,当遍历到到索引所在叶子节点后,它会发现叶子节点data元素里放的是索引所在行的磁盘文件的地址,那这个时候它就会根据这个地址去MYD文件里去定位这个个地址所在的表数据记录

从这里看出来由于MyISAM的数据、以及索引存储文件是分离的,它的MYI文件里的叶子节点存放的是索引所在行的磁盘文件的地址,所以它是非聚集索引的

InnoDB存储引擎:

根据下图我们可以发现如果表设计用的是InnoDB存储引擎的话,它的表结构、数据、以及索引是分两个文件存储的,frm来存放表结构,ibd用来存放索引跟表数据,如果我们根据一个索引字段去查询数据的话,它会去ibd文件根据B+trees索引结构从根节点开始遍历,当遍历到到索引所在叶子节点后,它会发现叶子节点data元素里放的就是这个索引字段所对应的那一行的表数据记录

从这里看出来由于InnoDB数据、以及索引存储文件是同一个文件,它的ibd文件里的叶子节点存放的是索引所对应的表的完整的数据记录,所以它是聚集索引(聚集索引要比非聚集索引快,因为非聚集索引要多一次磁盘io)

MySql索引结构类型

Mysql的主键索引(InnoDB)

InnoDB为什么要建议建立主键索引?

1.Mysql开发人员在设计InnoDB表的时候,因为ibd文件在存储这些数据必须要用一个B+treel来组织,如果我们表里面有主键,主键自带主键索引,那么就可以用主键来组织整张表的所有数据,如果我们不建立主键来存储数据的时候,那么InnoDB会从数据的第一列开始寻找,直到找到一列所有数据都不相等的索引列来组织这个B+tree,如果你的每个列数据都有相等的情况,那么InnoDB会帮你建立一个隐藏列,这个隐藏列会帮你维护一个唯一的id,然后它用这个隐藏列来组织整张表的数据,所以会建议InnoDB必须建立主键,因为mysql的这种数据库资源是很宝贵的,这些简简单单的事情你让mysql帮你做并不合适

为什么索引类型会建议选择整型?

1.当我们在用一个索引字段在查询某个表数据的时候,它会先去ibd文件里根据B+trees索引结构从根节点开始遍历最后定位到某个索引节点,这个整个遍历定位索引的过程中其实中间会经历过很多次数据比大小,那到底是整型比大小快还是uuid字符串比大小快呢?,字符串比大小需要根据ascii码逐位去比较,而且需要逐个字符去比较,如果我们一个字符串前面都相等就最后一位不相等,那这种情况下就要一直比较到最后一位了,所以是建议使用整型的原因之一

2.整型的话肯定要比长串的字符串占用的空间要小很多,大家都知道我们真真的数据以及索引在生产环境是存放在高性能的SSD里面的,那么这个SSD是很贵的,那么就是说我一个索引字段占用的空间越小,那么想同数据情况下整型要比字符串会省下更多的空间来存放更多的索引数据

为什么索引推荐自增?

1.由于B+tree要维持整个树从左到右从小到大的数据结构,当我们在插入的是自增的索引主键时候,B+tree只需要从左到右开辟新节点就完事了,但是如果我们插入的不是自增的主键的时候,B+tree不仅会分裂节点还会做树的平衡动作,所以这里建议自增主键提高B+tree的性能

MySql的二级索引(非聚集索引,因为叶子节点data元素里存放的并不是表完整数据,而是(聚集索引)主键) 二级索引叶子节点的data元素里存放的是InnoDB的主键索引(需要回表操作)

为什么非主键索引结构叶子节点存储的是主键值?

1.节省存储空间:如果非主键索引叶子节点也存储放数据的话那得占用多大的空间,如果我一个表有三四个索引就会有三四份的表数据

2.一致性:我们在插入一条数据的时候,主键索引和非主键索引都要维护整张表数据的话,那必须都得插入成功,要保证插入的完整一致性,但凡有个地方插入失败的话就会出问题,减少复杂度

Mysql的联合索引(联合主键) 索引的左列(它会按照你索引键的先后顺序帮你维护到B+tree中去)

1.以下图为列,当我们创建一条数据的时候,InnoDB会先根据你的name值根据ascii码逐位去比较,小的放左边大的放右边,如果name值相等的情况下(不相等的情况下面的age和position不会在比较了),我们会根据age值去比较大小,那么如果age也相等的时候以此类推就会比较position,

2.通过1分析,下图的sql查询只有第一条会走索引,因为我们知道索引的左列,都是从最左边的值依次维护到B+tree里的,所有name字段是有序的,但是age只有在name相等的情况下才会有序,position只有在name和age都相等的情况下才会有序,所以在没有name条件的查询下第二条和第三条都不会走索引



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3