information_schema.tables
我已经开始测试一些 MySQL 5.7 数据库来替换我们老化的 5.5 数据库,并且Table 记录数据大小的方式似乎发生了重大变化。
我运行以下查询:
SELECT
table_schema AS table_schema,
table_name AS table_name,
(data_length + index_length + data_free) AS table_size,
ROUND((data_length + index_length + data_free)/POWER(1024,3),2) AS table_sizeGB,
t.data_length,
t.index_length,
t.data_free
FROM information_schema.TABLES t
WHERE table_schema = 'myDb'
ORDER BY table_size DESC, table_name
LIMIT 10;
这给了我 10 个最大的表。我每天运行这个来记录随时间的增长。在 MySQL 5.5 上它需要 apx 5 秒,在 MySQL 5.7 上它是即时的。
在 MySQL 5.5 上,我得到最大表的以下结果:
myDb | myTable | 319383535616 | 297.45 | 319116279808 | 262012928 | 5242880
在 MySQL 5.7 上,我得到:
myDB | myTable | 270051115008 | 251.50 | 269824819200 | 226295808 | 0
这两个数据库都是相隔几天创建的。5.7 数据库是 5.5 数据库的从属数据库。两者都不活跃(只是作为活跃系统的奴隶)。
如果我查看服务器,表 .ibd 文件在 5.5 数据库上为 302GB,在 5.7 数据库上为 292GB。
我预计会有一个小差异(一个是使用 Antelope,另一个是 Barracuda 文件格式——两者都是 innodb)。数据不断添加到数据库中,并且很少(如果有的话)被删除。
在 MySQL 5.5 数据库上,我可以看到每次运行查询时数字都在增加,即使相隔仅几秒钟。但是在 MySQL 5.7 上,自从我一周前开始查看以来,这些数字并没有改变。
这是正确的行为吗?在我错过的 MySQL 5.7 中,有没有更好的方法来监视它?
--更新于 2018-10-16
三周后,查询结果在 MySQL 5.7 上仍然几乎相同:
5.5 -- myDb | myTable | 327890632704 | 305.37 | 327616036864 | 268304384 |6291456
5.7 -- myDb | myTable | 270055309312 | 251.51 | 269824819200 | 226295808 | 4194304
服务器上的物理大小在 MySQL 5.5 上为 310GB,在 MySQL 5.7 上为 300GB。
两个表的创建方式相同。
这两个数据库都还没有激活,所以唯一运行的查询(除了我的测试)来自复制。
两个数据库都使用innodb_file_per_table
.
MySQL 5.5 是使用 mysqldump 从活动的从服务器复制的。
5.7 数据库是使用 mysqldump + mysql_upgrade 从 MySQL 5.5 数据库复制而来的。
Optimize table 从未在这些表上运行过。
简短回答:数字很接近;不用担心。
长答案:
有很多解释。
ROW_FORMAT
?SELECTs
可能导致锁定,从而导致插入/更新/删除的额外碎片。innodb_file_per_table
一样吗?OPTIMIZE TABLE
在任何一台机器上都做过吗?(几乎没有理由每个人都这样做。)还,