- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我希望有人能解释为什么两个小时的数据清除据称会导致我的 mysql 实例上的数据使用量仅减少 32 KB。这是我的详细信息:
我有一个 mysql 数据库(在 Amazon RDS 上运行),我正试图从中清除数据。我这样做是为了避免存储空间用完,因为亚马逊将您的存储空间限制在 1TB,如果我们不采取任何行动,我们最终会达到这个限制。
我正在使用这个命令来计算我的表和索引的大小:
select * from information_schema.tables;
特别是有两个 InnoDB 表占用了我的大部分存储空间。我有一个循环遍历我最大的表删除记录的过程。在时间 t = 0 时,我运行了上面的 SQL 查询并得到了数据长度和索引数据长度的以下结果:
两个小时后,在连续运行我的数据库清理程序后,我运行了上面的 SQL 语句并得到以下结果:
这基本上意味着我削减了 32 KB 的表数据和 102 MB 的索引数据。
索引的减少是有道理的。表数据的减少非常小。在此期间不可能插入其他数据,因为我正在我的数据库的备份副本上运行此测试(RDS 的好处之一是您可以启动并运行数据库的完整副本以运行实验上,比如这个)。我还确认 AUTO_INCREMENT 值两次都相同。
有人可以解释为什么数据长度根本没有移动多少吗?数据长度只是一个非常快速和肮脏的近似值吗? mysql 最终会执行其他压缩步骤吗?还是我完全误解了这些字段的用法?
谢谢!
更新
我可能已经想通了——在时间 t=0
四个小时后,
这意味着我将 DATA_FREE 增加了大约 171MB。
这是否意味着如果我再插入 171MB,它将从 DATA_FREE 池中取出,因此我的数据长度不会增加?
换句话说,假设我从一个新的 InnoDB 表开始并插入 20 GB 的数据(假设 20 GB 合并了所有多余的 InnoDB 数据,我意识到 InnoDB 中存储的数据比 MyISAM 大),然后我删除所有数据,然后我插入 10 GB 的数据。当我运行 select * from information_schema.tables 时,我应该会看到 Data length of 10 GB 和 Data free of 10 GB,对吧?我不应该期望看到 30 GB 的数据长度/0 GB 的免费数据,也不应该期望看到 10 GB 的数据长度/10 GB 的免费数据?
更新 2
This post on Stack Overflow似乎也证实了我的分析。
最佳答案
表的“数据长度”包括表中可能存在的任何空闲空间。您可能需要OPTIMIZE
对表进行碎片整理,释放该空间。请注意,这可能会在执行操作时将表锁定一段时间。
使用 InnoDB 存储引擎 (CREATE TABLE ( ... ) ENGINE=InnoDB;
) 将使表优化在很大程度上变得不必要,并使数据库通常更快。如果您还没有使用它,您应该开始。 :)
关于mysql - 解读mysql的information_schema.tables DATA_LENGTH, INDEX_DATA_LENGTH and DATA_FREE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8004971/
我无法从 MySql 5.5 数据库中解释以下统计数据。 可能相关的辅助信息:一些表包含 TEXT 和 MEDIUMTEXT 列,大约 50%他们有空值。我对占用大部分空间的表进行了优化。 问题:我是
我希望有人能解释为什么两个小时的数据清除据称会导致我的 mysql 实例上的数据使用量仅减少 32 KB。这是我的详细信息: 我有一个 mysql 数据库(在 Amazon RDS 上运行),我正试图
innondb_file_per_table = 1。 我们有一个大表,其中 data_free 很大。 我们会定期清除此表中的旧数据。 早些时候(当我们使用 MySQL 5.5 时),我们观察到 d
这是我的innodb表的表状态 | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max
我在 MySQL 中有一个 MEMORY 表用于实时聊天(也许这不是最好的表类型?),并且每晚删除行以保持聊天日志的可管理性导致表中的开销。但是,由于您不能在 MEMORY 表上运行 OPTIMIZE
我不完全确定 information_schema.TABLES.DATA_FREE 在 MySQL 中的含义。 谁能帮我理解一下? 谢谢。 最佳答案 DATA_FREE- 已分配但未使用的字节数。它
我是一名优秀的程序员,十分优秀!