前言

公司的MySQL服务报警了占用超过了90% 所以找到一下是哪些表过大导致的

解决

  1. 先删除了一些无用的备份表
  2. 删了一些表中的记录 如三个月之前的日志记录
  3. 清理一下无用的索引

发现问题

再清理某个日志表时 发现删除记录后表并没有变小 查询原因

因为我们表使用的是InnoDB引擎

InnoDB表空间在插入数据时会增长,但删除数据时文件不会缩小.因此,例如,如果您插入100万行,然后删除它们,该文件将有很多物理分配的空间,但不再使用.如果可以再次增加表空间文件,InnoDB将重新使用该空间.
此外,即使您不删除,也可能存在一些“浪费”的空间,因为当表空间文件的大小增加时,它们会被一大块页面扩展,这些页面由配置选项innodb_autoextend_increment(以兆字节为单位)决定.在这些页面被数据填充之前,它们是可用空间.
InnoDB报告的Data_free是中心表空间文件中空页“浪费”的空间量.它与NULL值无关,它与没有行的数据页有关.
Data_free仅报告完全空的扩展区留下的空间(扩展区是一个等于1MB的页面块).您会注意到data_free始终是1MB的倍数.较小的空闲页面块不计入data_free,也不计算部分填充的页面.所以“浪费”的空间可能要大得多,但我们无从知晓.

解决方案

optimeze table `table_name`

注意事项

由于命令optimize会进行锁表操作,所以进行优化时要避开表数据操作时间,避免影响正常业务的进行。