一、背景

电商平台每天几百万的库存流水记录,库存流水记录越来越大,后面所以要定期清理(做delete操作),只保存仅15天的,但是由于库存流水表中有很多变长的字段(varchar),所以采用delete语句删除数据之后,磁盘空间的复用率比较低,因此需要采取OPTIMIZE TABLE的方式整理磁盘空间。

执行的SQL如下:

OPTIMIZE TABLE inventory_xxx;

SQL执行完之后,提示信息如下:

Table does not support optimize, doing recreate + analyze instead

此外:MySQL官方建议不要经常(每小时或每天)进行碎片整理;一般根据实际情况,只需要每周或者每月整理一次。

1、OPTIMIZE TABLE的特点

  1. OPTIMIZE TABLE只对MyISAM,BDB和InnoDB表起作用,尤其是MyISAM表的作用最为明显。然而,并不是所有表都需要进行碎片整理,一般只需要对包含变长的文本数据类型(varchar)的表进行碎片整理。
  2. 在OPTIMIZE TABLE运行过程中,MySQL会锁定表。
  3. 默认情况下,直接对InnoDB引擎的数据表使用OPTIMIZE TABLE,可能会显示「 Table does not support optimize, doing recreate + analyze instead」的提示信息。需要在mysqld启动mysql的时候加上--skip-new--safe-mode

2、optimize优化原理

对mysql进行大量删改操作时,磁盘上的空间并没有被立即收回(数据空间、索引位),而是等待新的数据来填充空缺。

  • 这些空间可以被后续的insert操作重复利用,但如果记录是变长的,则并不是所有的空间都能被重复利用;
  • 因此会形成一个空间碎片,影响磁盘IO

optimize可以把分散(fragmented)存储的数据重新挪到一起(defragmentation),清除碎片,回收闲置的数据库存储空间。

我们知道optimize操作仅能对MyISAM表、BDB表、InnoDB表进行重建,针对不同的存储引擎,optimize做的事情也不同:

1> InnoDB表

对于InnoDB表,OPTIMIZE TABLE操作会被映射到ALTER TABLE上,重建表。

  • 重建操作会 更新索引统计数据 并 释放聚簇索引中 未使用的空间。

2> MyISAM表

对于MyISAM表,OPTIMIZE TABLE按如下方式操作:

  1. 如果表含有删除的列、分裂的列,则修复表。
  2. 如果索引页没有排序,则将索引页进行排序。
  3. 如果表的统计数据没有更新(并且通过对索引进行分类不能实现修复),则更新。

3> BDB表

对于BDB表,OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。

二、解决方案

我们可以用mysqld --skip-newmysqld --safe-mode命令来重启MySQL,以便于让引擎支持OPTIMIZE TABLE。

再次执行SQL:optimize table user,结果如下:

三、查看表占用的磁盘空间

SQL如下:

SELECTTABLE_NAME,( DATA_LENGTH + INDEX_LENGTH )/ 1048576 AS size_Mb,TABLE_ROWS
FROMinformation_schema.TABLES
WHERETABLE_SCHEMA = 'xx_db' AND TABLE_NAME = 'xx_table';

示例查询结果:

MySQL Innodb存储引擎 Table does not support optimize, doing recreate + analyze instead 解决方案相关推荐

  1. mysql进阶:optimize table 优化表命令 Table does not support optimize, doing recreate + analyze instead

    optimize table table_name 1. 问题描述 在使用mysql的时候有时候,可能会发现尽管一张表删除了许多数据,但是这张表表的数据文件和索引文件却奇怪的没有变小.这是因为mysq ...

  2. Table does not support optimize, doing recreate + analyze instead

    在清理mysql数据表后,执行optimize优化和整理文件碎片,Msg_text中提示"表不支持优化,使用重新创建或者分析进行替代" mysql> optimize tab ...

  3. MySQL InnoDB 存储引擎索引那些事儿

    InnoDB 存储引擎中,表是根据主键顺序组织存放的,称为索引组织表.每个表都有一个主键,如果没有显示定义主键,则会选择第一个创建的非空唯一索引作为主键,如果没有非空唯一索引,InnoDB引擎则自动创 ...

  4. 浅析Mysql InnoDB存储引擎事务原理

    浅析Mysql InnoDB存储引擎事务原理 大神:http://blog.csdn.net/tangkund3218/article/details/47904021

  5. MySQL Innodb存储引擎使用B+树做索引的优点

    对于数据库来说,索引和表数据都是存放在磁盘上的,一般使用B+树作为索引 MySQL Innodb存储引擎使用了B+树作为索引的优点,主要有以下原因: 1.索引和表数据都是存放在磁盘上的,如果磁盘上的数 ...

  6. 为什么MySQL InnoDB 存储引擎要用B+树做索引,而不用B树?

    为什么MySQL InnoDB 存储引擎 要用B+树做索引,而不用B树? (1)B+树空间利用率更高,可减少I/O次数 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存 ...

  7. mysql InnoDB存储引擎的介绍

    mysql InnoDB存储引擎的介绍 概念 1.InnoDB是MySQL默认的存储引擎,如果需要其不支持的特性,则考虑使用其他存储发动机. 2.InnoDB采用MVCC支持高并发,实现四个标准隔离级 ...

  8. MySQL InnoDB存储引擎

    呵呵哒... MySQL体系结构和存储引擎 首先要搞懂的是什么是数据库,什么是数据库实例. 数据库:物理操作系统文件或其他形式文件类型的集合. 实例:MySQL数据库由后台线程以及一个共享内存区组成, ...

  9. 数据结构与索引-- mysql InnoDB存储引擎索引

    索引与算法 索引是我们在应用开发过程中程序数据可开发的一个重要助力.也是一个重要的研究方向,索引太多,应用的性能可能受到影响,如果索引太少,对查询性能又会有制约.我们需要找到一个合适的平衡点,这个对性 ...

最新文章

  1. android studio jni路径配置
  2. 如何用我python抓取关键字新闻_用python机器学习实现新闻关键词的抽取
  3. java拆解_深入拆解Java虚拟机视频教程
  4. springboot返回modelandview 找不到视图_SpringBoot错误处理机制及原理
  5. 记一次笑哭的unterminated string literal报错
  6. python 爬取企业注册信息_python爬取企业名录
  7. [react] 在react中怎样改变组件状态,以及状态改变的过程是什么?
  8. JS高级——模块化学习笔记
  9. 小米鼠标垫功能奇异 价格也不贵
  10. WebView的使用之Android与JS通过WebView互调方法
  11. MFC三大dll使用总结
  12. SACC 2016:专访宜信大数据研发经理侯松
  13. 对灰色按钮克星的屏蔽
  14. PhotoKit在线图片编辑器
  15. 裁剪算法(计算机图形学)
  16. java基于springboot高校信息资源共享网站系统
  17. 带你使用JS-SDK自定义微信分享效果
  18. 基于 Spring Boot 的停车场管理系统
  19. 如何有效实现软件的需求管理 - 7
  20. Android Studio 一键切换界面风格

热门文章

  1. 算法:如何在100个人中找出有且仅有的一位确诊新冠的人
  2. jsp+mysql汽车维修管理系统的设计与开发_基于jsp+mysql+Spring+mybatis的SSM汽车维修中心管理系统...
  3. DAC8822QBDBTR
  4. HTML网页中,嵌套HTML页面
  5. android手机屏幕适配理论知识
  6. Ubuntu 报错:E: Package ' *** ' has no installation candidate
  7. CAD图纸打开文字数据显示乱码
  8. Databricks 第6篇:Spark SQL 维护数据库和表
  9. shell执行脚本的方法及环境变量
  10. Android四大组件系列7 Broadcast广播机制(上)