mysql库

索引是放在磁盘上面的一种数据结构,单独一个磁盘空间放置索引字段对应的值,以及该值对应一条数据记录的磁盘的地址,如果没有索引,根据磁盘地址挨个判断,值是否与查询的值相同,有索引以后再索引空间直接检索到该值,也就能查找到这条记录对应的磁盘地址。

主键索引与唯一索引的区别就是,主键索引不能为空,唯一索引可以有一个空值。

二叉查找数据,从中间值开始筛选,每次都能筛掉一半的值。左子树节点比父节点小,右子数节点比父节点大

平衡二叉树(ABLTree):左右子树的深度差绝对不能超过1

当顺序插入数值,会只有左节点或者只有右节点,平衡二叉树通过右旋或者左旋做到左右子树深度差不超过1

平衡二叉树,每个节点存储:索引字段值,对应该条记录的磁盘地址,左子树几点的引用地址,右子树节点的引用

innodb每次操作磁盘最小单位为page 16KB,从磁盘加载数据到内存,默认该数据周围数据都会被访问到,被加载到内存,局部性原理。访问一次节点就是一次磁盘的IO,每个节点占位为16KB= 16384 bytes,如果每个磁盘块存放节点很少,造成大量的寻址时间的浪费。数的深度太深了

B数,使用分裂合并保证B树的平衡,叫多路平衡查找树,节点拥有的子数量称为度,关键字数为N, 则度为N+1,每个节点是一个page,就是页的合并和分裂

索引存储结构使用B+Tree,加强版的多路平衡查找树,节点拥有的子数量称为度,关键字数为N, 则度为N,只有叶子节点才存储完整的该索引数据对应的该条记录的磁盘地址。所有的数据都是放在叶子节点的,所有数据查找的IO的次数,数据的深度都是相同的,保证稳定的IO效率,每个相邻的叶子节点,都有指向相邻叶子节点的指针。

B+Tree, 解决树深的问题,解决IO次数多问题,扫库、扫表能力强,根据相邻叶子节点的指针就能扫表拿到所有数据,不用每次从根节点查找。排序能力更强,叶子节点是有序链表,效率稳定。

可以规定索引为Hash值,根据Hash码,查找记录,只能等值查找,范围查找不支持走索引

mysql存储引擎为innodb,存储引擎就是表类型,表存储数据与管理数据的方式,每张表都可以有自己的存储引擎,没指定默认为innodb,支持行级锁,支持事物。

在myisam存储引擎中,索引都是B+Tree结构,索引放在.MYI文件中,叶子节点放有该条记录对应的磁盘地址。具体数据放在.MYD文件中,根据磁盘地址,获取数据。

在innodb中,索引为B+Tree结构,主键索引,innodb存储引擎将该索引对应的完整的所有字段的数据放到了叶子节点。主键的键值的顺序就决定了物理存放的顺序,物理顺序跟主键键值一致的索引叫聚集索引,只有主键索引才是聚集索引。

决定了物理存放数据的索引叫聚集索引。

如果一个表里面没有主键,那么决定物理顺序的就是unique唯一不为空的字段,如果两者都没有,会有一个隐藏的rowid来当做聚集索引决定物理磁盘顺序。

innodb中,除了主键索引以外其他的索引都叫辅助索引或者二级索引

完整的数据只有一份,只会在主键索引的叶子节点存储。其他的索引,叶子节点存储的除了该索引字段的值,还存放对应的该条记录的主键索引的值。

辅佐索引对应一颗B+Tree,查找的时候,从辅助索引的跟节点,找到查找值对应的叶子节点,拿到主键索引的值,扫描主键索引对应的B+Tree走到叶子节点,拿到最终的该条记录的所有字段值。比主键索引多扫描一颗B+Tree。

联合索引,最左匹配

在mysql中能不能用到索引是optimizer(优化器)决定,他会实时计算,查找成本决定是否使用索引

在索引列使用函数或者表达是计算不能走索引。

字符串不加引号,出现隐式转换不走索引

like条件前面加%前缀不走索引,后面加%可以走索引

not like, not in ,<>这种不一定是否走索引

如果索引字段有空值,可能

数据库优化:

建表三范式:一范式:表字段具有原子性,不能再分;第二范式:满足第一范式,没有部分依赖,主键不做业务处理。第三范式:满足第二范式,没有传递依赖。

根据三范式冗余小,更新删除操作简单,也要根据需求来合理建表。

尽量使用正确的存储数据的最小数据结构

尽量使用整型表示字符串,尽量使用not null, null使得索引和统计比较复杂,索引尽量不建在可为空字段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值