IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL Innodb存储引擎 Table does not support optimize doing recreate + analyze instead 解决方案 -> 正文阅读

[大数据]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的特点

  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如下:

SELECT
	TABLE_NAME,
	( DATA_LENGTH + INDEX_LENGTH )/ 1048576 AS size_Mb,
	TABLE_ROWS 
FROM
	information_schema.TABLES 
WHERE
	TABLE_SCHEMA = 'xx_db' 
	AND TABLE_NAME = 'xx_table';

示例查询结果:
在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-06-06 17:25:11  更:2022-06-06 17:26:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 0:32:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码