数码之家

 找回密码
 立即注册
搜索
查看: 1102|回复: 0

MySQL innodb:OPTIMIZE TABLE: Table does not support optimize, doing recreate + analyze instead

[复制链接]
发表于 2023-12-11 18:34:38 | 显示全部楼层 |阅读模式 IP属地:福建厦门

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不长叶子的树 于 2023-12-11 18:35 编辑

如果我们 删除了很多数据,或者在插入数据时,不是按照主键的递增顺序插入的,很可能会因此产生很多内存碎片,影响数据查询的效率。这是因为在删除数据时,MySQL 并不会立即将它们清除并整理空间,而是将它们标记为删除,通过 OPTIMIZE TABLE 可以将空间进行整理,优化,减少内存碎片。

InnoDB 引擎并不支持 OPTIMIZE TABLE 操作,它会提示如下信息:

  1. OPTIMIZE TABLE xxxx_table;
复制代码
-- Table does not support optimize, doing recreate + analyze instead

我们可以通过不做任何操作的 ALTER 命令来重建表达到以上目的:

  1. alter table xxxx_table engine=InnoDB;
复制代码

执行完成后,我们通过如下 SQL 查看执行情况,如果 data_free 列为 0,说明我们空间碎片整理成功

  1. show table status from xxxx_db like xxxx_table;
复制代码

不过,多数情况下不需要执行该操作。
找到并修复损坏的表

可能因硬件问题、MySQL 本身的缺陷或者操作系统的问题导致索引损坏,当然这种问题非常少见,我们可以通过如下 SQL 来检查大多数表和索引的错误:

check table xxxx_table;

如果发现异常的话,可以通过如下 SQL 进行修复:

  1. repair table xxxx_table;
复制代码

-- 如果存储引擎不支持上述操作的话,也可通过表重建来完成
  1. alter table xxxx_table engine=InnoDB;
复制代码

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-5-15 05:21 , Processed in 0.109200 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表