IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

数据库的堆表与索引组织表的数据存储格式讨论

MySQLOPS 数据库与运维自动化技术分享 2012-12-09 20:14:51 累计浏览 5,598 次
本机暂存

汪洋@tiptop(967409) 2012/8/29 21:48:48

InnoDB存储引擎为mysql数据库快速小巧这一特点做的,就是你按有序主键去查找,不要更新主键

汪洋@tiptop(967409) 2012/8/29 21:49:57

二级索引的更新,需要overflow segment的问题在rdbms都避免不了吧

文科@EC(101800844) 2012/8/29 22:03:13

不知道分形索引是如何实现的

汪洋@tiptop(967409) 2012/8/29 22:05:31
oracle数据库实现关系型数据库rdbms的来说:大 全 精

mysql数据库实现rdbms的来说: 小 轻 快

文科@EC(101800844)  20:09:17

大家怎么看 SELECT xxx FROM TABLE1 WHERE id IN(xxx, yyy, zzz…)  , IN 里面有数千个值的查询?

毛剑@金山<iammao@vip.qq.com> 2012/8/29 22:11:50

1、IOT因为是有序的,所以对IOT的频繁无序的插入操作会导致索引块的分裂,这会严重影响插入操作的性能;而堆表不存在这个问题;

2、IOT因为是有序的,所以在批量导入大量无序数据方面,IOT的速度要比堆表差很多;

3、IOT因为是有序的,所以对IOT表主键的更新涉及到可能要移动数据到另外一个块,堆表一般不存在这个问题;

4、IOT因为是有序的,所以随着数据的插入和索引块的分裂,每条记录所在的物理存储位置可能会发生变化,这样如何维护在IOT上建立的二级索引的效率就是个问题,Oracle是通过physical guess来解决的,InnoDB存储引擎是如何做的?

5、即便是对IOT中非主键的更新,也可能会导致更新后的数据要挪到overflow segment,这样实际上是发生了row chain,这会影响查询IOT中数据的速度(很显然是因为查询所需要的IO次数的增加)。

在Oracle数据库中,IOT一般适合于那些不怎么频繁更新且又需要快速按主键访问的数据库表。

1、如果表大量顺序扫描 ,heap table 就大哭了。。。,尤其经常UPDATE 主键 ,ORDER BY 之类;

2、batch insert 的时候可以优先考虑对插入结果集进行排序;

3、大量无序插入 可以 使用id 自增seq uuid 等方式顺序插入,

  那堆表鸡肋的顺序扫描依然暴露无遗;

4、你见过谁 没事 更新主键的吗?

5、 堆表 可耻的 先插入一条记录,然后另外的表大量占用PAGE 再插入一条,,堆表的  index scan 即可 大量随机IO 读heap 劣势其实很大…;哥们怎么想的。。。

毛剑@金山<iammao@vip.qq.com> 2012/8/29 22:24:54

HEAP 要依赖IAM 和PFS来 定位写入,很多问题的,经典的就是被我这样折腾过,写满第一页,再大量插入另外一个表,然后刚才哪个表的下一页就悲剧了…

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  2. Facebook 网站架构 (累计阅读 11,112)
  3. 腾讯php程序员面试题目答案 (累计阅读 8,973)
  4. 腾讯分析系统架构解析 (累计阅读 7,769)
  5. 分布式系统的事务处理 (累计阅读 7,383)
  6. PHP Extension开发基础 (累计阅读 6,644)
  7. 如何设计用户登录 (累计阅读 6,643)
  8. MySQL 5.6 测试之 Replication(主从复制) (累计阅读 6,268)
  9. 什么是二维码?有什么用? (累计阅读 5,890)
  10. 在perl中连接和使用sqlite做数据存储 (累计阅读 5,811)