DB-TUTORIAL DB-TUTORIAL
数据库综合
数据库中间件
  • 综合
  • Mysql
  • 其他
  • MongoDB
  • Redis
  • Elasticsearch
  • Elastic技术栈
GitHub (opens new window)
数据库综合
数据库中间件
  • 综合
  • Mysql
  • 其他
  • MongoDB
  • Redis
  • Elasticsearch
  • Elastic技术栈
GitHub (opens new window)
  • 数据库综合

  • 数据库中间件

  • 关系型数据库

    • 综合

    • Mysql

      • Mysql 应用指南
      • MySQL 工作流
      • Mysql 事务
      • Mysql 锁
      • Mysql 索引
      • Mysql 性能优化
      • Mysql 运维
      • Mysql 配置
      • Mysql 常见问题
        • 为什么表数据删掉一半,表文件大小不变
        • 参考资料
    • 其他

  • 文档数据库

  • KV数据库

  • 列式数据库

  • 搜索引擎数据库

  • 数据库
  • 关系型数据库
  • Mysql
dunwu
2020-09-12
目录

Mysql 常见问题

# Mysql 常见问题

📦 本文以及示例源码已归档在 db-tutorial (opens new window)

# 为什么表数据删掉一半,表文件大小不变

【问题】数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变?

表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数 innodb_file_per_table 控制的:

  1. 这个参数设置为 OFF 表示的是,表的数据放在系统共享表空间,也就是跟数据字典放在一起;
  2. 这个参数设置为 ON 表示的是,每个 InnoDB 表数据存储在一个以 .ibd 为后缀的文件中。

从 MySQL 5.6.6 版本开始,它的默认值就是 ON 了。

我建议你不论使用 MySQL 的哪个版本,都将这个值设置为 ON。因为,一个表单独存储为一个文件更容易管理,而且在你不需要这个表的时候,通过 drop table 命令,系统就会直接删除这个文件。而如果是放在共享表空间中,即使表删掉了,空间也是不会回收的。

所以,将 innodb_file_per_table 设置为 ON,是推荐做法,我们接下来的讨论都是基于这个设置展开的。

我们在删除整个表的时候,可以使用 drop table 命令回收表空间。但是,我们遇到的更多的删除数据的场景是删除某些行,这时就遇到了我们文章开头的问题:表中的数据被删除了,但是表空间却没有被回收。

插入和删除操作可能会造成空洞。

  • 插入时,如果插入位置所在页已满,需要申请新页面。
  • 删除时,不会删除所在页,而是将记录在页面的位置标记为可重用。

所以,如果能够把这些空洞去掉,就能达到收缩表空间的目的。

要达到收缩空洞的目的,可以使用重建表的方式。

# 参考资料

  • 《高性能 MySQL》 (opens new window)
  • MySQL 实战 45 讲 (opens new window)
📝 帮助改善此页面! (opens new window)
#数据库#关系型数据库#Mysql#FAQ
上次更新: 2024/10/09, 07:16:02
Mysql 配置
PostgreSQL 应用指南

← Mysql 配置 PostgreSQL 应用指南→

最近更新
01
HBase Java API 管理功能
04-13
02
HBase Java API 其他高级特性
03-31
03
HBase 数据模型
03-16
更多文章>
Theme by Vdoing | Copyright © 2019-2024 钝悟(dunwu) | CC-BY-SA-4.0
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×