ddb mysql_mysql存储

mysql的默认存储引擎是innodb。什么是存储引擎,就是不同数据的不同组织形式。比如innodb就是在叶子节点上存储索引的key值和data数据,数据具体是表的一条记录。

mysql5.5中表有两个文件,一个存储的是表结构,一个存储的是数据和索引。这涉及到存储索引的数据结构是b+树,非叶子节点上存储索引还有指针,指针是物理地址,这是固定不能更改的,如果地址变了,那就找不到对应的索引文件了。所以如果进行优化,那优化的也是索引,也就是key值的字节长度,比如原来的key值是10字节,优化成为1字节,那一个磁盘块存储的内容会更多,比如增加指针和索引,这样就有更多的区间。磁盘预读的时候,存在一个页的概念,一页是4k,一般读取是页的整数倍。一个磁盘块是16k,但不一定都是16k,这里我们先拿16k来举例。一个磁盘块内存是16k,b+树如果是三层,在这个前提下,第一层存储的一个key值是10字节,那么第一层可以存多少条记录?是1600,第二层同理,第三层由于存储的不止是key值,还有数据,一条数据1k,那么总共存16条,那么这三层下来就是1600✘1600✘16=四千万条记录。如果将key值缩小十倍,那就会放大100倍。当然,这只是一个估算。此外,b+树还有一个特点,就是底层第三层是双向链表,查询的时候可以一层一层去遍历。

一般建表的时候会设置主键索引,但没有主键索引的时候就会是唯一键,没有唯一键mysql会自动生成rowid作为索引。这是innodb的机制。

这里还涉及几个概念。关于回表,如果我们将name字段生成索引,主键是id,name字段的具体值就是key值了,根据key值索引值去查询id,然后根据id获取整条数据,这样会走两次b+树,叫做回表。

还有联合主键,或者叫联合索引,涉及一个最左匹配,比如name和age作为联合主键,那么在查询的时候,用那么能查,用name  and age也能查,但是用age就无法查询了。如果是age 和 name呢?也是能查的,因为mysql内部有一个优化器,不仅会寻找最适合的存储引擎,也会更换两个字段的顺序。

最后再做一个innodb和myisam的对比吧,innodb支持事务和外键,表锁和行锁,而myisam只有表锁。

最后既然提到了事务,那就简单回顾一下ACID,事务的原子性,隔离性,一致性,持久性,都很好理解。commit和rollback。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值