MySQL Innodb存储引擎 Table does not support optimize, doing recreate + analyze instead 解决方案
一、背景
电商平台每天几百万的库存流水记录,库存流水记录越来越大,后面所以要定期清理(做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的特点
- OPTIMIZE TABLE只对MyISAM,BDB和InnoDB表起作用,尤其是MyISAM表的作用最为明显。然而,并不是所有表都需要进行碎片整理,一般只需要对包含变长的文本数据类型(varchar)的表进行碎片整理。
- 在OPTIMIZE TABLE运行过程中,MySQL会锁定表。
- 默认情况下,直接对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按如下方式操作:
- 如果表含有删除的列、分裂的列,则修复表。
- 如果索引页没有排序,则将索引页进行排序。
- 如果表的统计数据没有更新(并且通过对索引进行分类不能实现修复),则更新。
3> BDB表
对于BDB表,OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。
二、解决方案
我们可以用mysqld --skip-new
或 mysqld --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 解决方案相关推荐
- mysql进阶:optimize table 优化表命令 Table does not support optimize, doing recreate + analyze instead
optimize table table_name 1. 问题描述 在使用mysql的时候有时候,可能会发现尽管一张表删除了许多数据,但是这张表表的数据文件和索引文件却奇怪的没有变小.这是因为mysq ...
- Table does not support optimize, doing recreate + analyze instead
在清理mysql数据表后,执行optimize优化和整理文件碎片,Msg_text中提示"表不支持优化,使用重新创建或者分析进行替代" mysql> optimize tab ...
- MySQL InnoDB 存储引擎索引那些事儿
InnoDB 存储引擎中,表是根据主键顺序组织存放的,称为索引组织表.每个表都有一个主键,如果没有显示定义主键,则会选择第一个创建的非空唯一索引作为主键,如果没有非空唯一索引,InnoDB引擎则自动创 ...
- 浅析Mysql InnoDB存储引擎事务原理
浅析Mysql InnoDB存储引擎事务原理 大神:http://blog.csdn.net/tangkund3218/article/details/47904021
- MySQL Innodb存储引擎使用B+树做索引的优点
对于数据库来说,索引和表数据都是存放在磁盘上的,一般使用B+树作为索引 MySQL Innodb存储引擎使用了B+树作为索引的优点,主要有以下原因: 1.索引和表数据都是存放在磁盘上的,如果磁盘上的数 ...
- 为什么MySQL InnoDB 存储引擎要用B+树做索引,而不用B树?
为什么MySQL InnoDB 存储引擎 要用B+树做索引,而不用B树? (1)B+树空间利用率更高,可减少I/O次数 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存 ...
- mysql InnoDB存储引擎的介绍
mysql InnoDB存储引擎的介绍 概念 1.InnoDB是MySQL默认的存储引擎,如果需要其不支持的特性,则考虑使用其他存储发动机. 2.InnoDB采用MVCC支持高并发,实现四个标准隔离级 ...
- MySQL InnoDB存储引擎
呵呵哒... MySQL体系结构和存储引擎 首先要搞懂的是什么是数据库,什么是数据库实例. 数据库:物理操作系统文件或其他形式文件类型的集合. 实例:MySQL数据库由后台线程以及一个共享内存区组成, ...
- 数据结构与索引-- mysql InnoDB存储引擎索引
索引与算法 索引是我们在应用开发过程中程序数据可开发的一个重要助力.也是一个重要的研究方向,索引太多,应用的性能可能受到影响,如果索引太少,对查询性能又会有制约.我们需要找到一个合适的平衡点,这个对性 ...
最新文章
- android studio jni路径配置
- 如何用我python抓取关键字新闻_用python机器学习实现新闻关键词的抽取
- java拆解_深入拆解Java虚拟机视频教程
- springboot返回modelandview 找不到视图_SpringBoot错误处理机制及原理
- 记一次笑哭的unterminated string literal报错
- python 爬取企业注册信息_python爬取企业名录
- [react] 在react中怎样改变组件状态,以及状态改变的过程是什么?
- JS高级——模块化学习笔记
- 小米鼠标垫功能奇异 价格也不贵
- WebView的使用之Android与JS通过WebView互调方法
- MFC三大dll使用总结
- SACC 2016:专访宜信大数据研发经理侯松
- 对灰色按钮克星的屏蔽
- PhotoKit在线图片编辑器
- 裁剪算法(计算机图形学)
- java基于springboot高校信息资源共享网站系统
- 带你使用JS-SDK自定义微信分享效果
- 基于 Spring Boot 的停车场管理系统
- 如何有效实现软件的需求管理 - 7
- Android Studio 一键切换界面风格
热门文章
- 算法:如何在100个人中找出有且仅有的一位确诊新冠的人
- jsp+mysql汽车维修管理系统的设计与开发_基于jsp+mysql+Spring+mybatis的SSM汽车维修中心管理系统...
- DAC8822QBDBTR
- HTML网页中,嵌套HTML页面
- android手机屏幕适配理论知识
- Ubuntu 报错:E: Package ' *** ' has no installation candidate
- CAD图纸打开文字数据显示乱码
- Databricks 第6篇:Spark SQL 维护数据库和表
- shell执行脚本的方法及环境变量
- Android四大组件系列7 Broadcast广播机制(上)