mysql进阶:optimize table 优化表命令 Table does not support optimize, doing recreate + analyze instead-程序员宅基地

技术标签: database  mysql  数据库  

optimize table table_name

1. 问题描述

在使用mysql的时候有时候,可能会发现尽管一张表删除了许多数据,但是这张表表的数据文件和索引文件却奇怪的没有变小。这是因为mysql在删除数据(特别是有Text和BLOB)的时候,会留下许多的数据空洞/碎片,这些空洞会占据原来数据的空间,所以文件的大小没有改变。这些空洞在以后插入数据的时候可能会被再度利用起来,当然也有可能一直存在。这种空洞不仅额外增加了存储代价,同时也因为数据碎片化降低了表的扫描效率。

2. 使用场景

如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片。

当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小。这是因为删除操作后在数据文件中留下碎片所致。

在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次即可,只对特定的表运行。

OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。

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

  • 对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。

注意:在OPTIMIZE TABLE运行过程中,MySQL会锁定表。

对于myisam可以直接使用 optimize table table_name, 当是InnoDB引擎时,会报“Table does not support optimize, doing recreate + analyze instead”,一般情况下,由myisam转成innodb,会用alter table table.name engine='innodb’进行转换,优化也可以用这个。所以当是InnoDB引擎时我们就用alter table table.name engine='innodb’来代替optimize做优化就可以。

查看前后效果可以使用show table status命令,例如show table status from [database] like ‘[table_name]’;返回结果中的data_free即为空洞所占据的存储空间。

总结

1.MySQL官方建议不要经常(每小时或每天)进行碎片整理,一般根据实际情况,只需要每周或者每月整理一次即可。
2.OPTIMIZE TABLE只对MyISAM,BDB和InnoDB表起作用,尤其是MyISAM表的作用最为明显。此外,并不是所有表都需要进行碎片整理,一般只需要对包含上述可变长度的文本数据类型的表进行整理即可。
3.在OPTIMIZE TABLE运行过程中,MySQL会锁定表。
4.默认情况下,直接对InnoDB引擎的数据表使用OPTIMIZE TABLE,可能会显示「 Table does not support optimize, doing recreate + analyze instead」的提示信息。这个时候,我们可以用mysqld --skip-new或者mysqld --safe-mode命令来重启MySQL,以便于让其他引擎支持OPTIMIZE TABLE。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/agonie201218/article/details/124970247

智能推荐

配置炫酷的终端_meslolgs nf-程序员宅基地

文章浏览阅读1k次。一、MacOs系统MacOs中终端使用Iterm2。1. 配置oh-my-zsh插件的存放位置:~/.oh-my-zsh/plugins, 下载常用的插件 git clone https://github.com/zsh-users/zsh-syntax-highlighting.git修改配置文件生效配置:source ~/.zshrc配置文件:2. 字体安装字体 brew tap homebrew/cask-fonts brew cask install font-ha_meslolgs nf

TensorFlowJS 基础 -前端人工智能入门必看系列_tfjs-程序员宅基地

文章浏览阅读4.4k次,点赞2次,收藏13次。TensorFlowJS 基础1、什么是tfjsTensorFlow.js 是一个 JavaScript 库,用于在浏览器和 Node.js 训练和部署机器学习模型。了解开始的更多方式,请参阅下面的部分。2、学习大纲3、数据张量(Tensor)和变量(Variable)是 TensorFlow.js 中数据的主要表现形式。3.1、张量(Tensor)定义: 一组数值形成一个或多个维度的数组。 张量实例具有定义数组形状的形状属性。张量是 TensorFlow.js 中数据的中心单位,也是 T_tfjs

Java后端实现视频分段渐进式播放_java视频播放分片读取-程序员宅基地

文章浏览阅读1.2w次,点赞34次,收藏164次。大文件的分片上传可以看笔者前面的文章:大文件分片上传前后端实现。这篇文章,主要记录一下,服务端如何将一个大的视频文件做切分,分段响应给客户端,让浏览器可以渐进式的播放。_java视频播放分片读取

用指针把数组元素逆序输出-程序员宅基地

文章浏览阅读1k次。View Code #include<iostream>using namespace std;int main(){ int a[]={12,4,65,8,325,9,88,56,45,17,77}; int *p1,*p2,t,length; length=sizeof(a)/sizeof(a[0]); p1=a;p2=a+l...

语义分割-U-Net_语义分割 overlap-程序员宅基地

文章浏览阅读352次。U-Net论文原文0. 简介1. 网络结构2. overlap-tile重叠策略3. 损失函数设计4. 网络初始化5. 实验结果6. 总结论文原文U-Net: Convolutional Networks for Biomedical Image Segmentation0. 简介  U-Net基于FCN网络进行拓展,使得其在可用数据量较少的医学图像分割领域取得了很好的分割效果:在上采样过程中,大幅提升了featureMap的通道数,使得底层语义信息能够更好地传递到上层;decoder过程,不_语义分割 overlap

几种有趣的不常见排序-程序员宅基地

文章浏览阅读3.1k次,点赞3次,收藏10次。几种有趣的不常见排序算法我们常见的排序算法有简单选择,冒泡,插入,两路合并,希尔,堆,快速排序等等,下面介绍几种有趣的不常见的排序算法。如:鸡尾酒排序,鸽巢排序,奇偶排序,梳排序,臭皮匠排序,图书馆排序,bogo排序等等。_不常见排序

随便推点

iOS检测系统弹窗并自动关闭-程序员宅基地

文章浏览阅读1.5k次。#####为了自动点击应用内部的系统级弹窗,比如询问推送, 询问定位等弹窗的自动点击 , 有人会问干什么用, 自动化测试%hookSBUserNotificationAlert-(void)willActivate{NSLog(@"_ios 自动化测试框架监测 app系统弹框

numpy.random函数整合(部分)_numpy.random.normal函数-程序员宅基地

文章浏览阅读2.4k次,点赞6次,收藏18次。在我们进行python数据分析的学习和应用过程中,经常需要用到numpy的随机函数,由于随机函数random的功能比较多,经常会混淆或记不住,下面由我进行一部分的总结1.numpy.random.randnumpy.random.rand(d1 , d2,…dn)rand函数创建一个给定类型的数组,将其填充在一个均匀分布的随机样本[0, 1)中。a=np.random.rand(2,2)#shape:2*2print(a)[[0.22305618 0.64853825] [0.11869_numpy.random.normal函数

小试牛刀Matplotlib_integer subplot specification must be a three-digi-程序员宅基地

文章浏览阅读1.6k次。1、plt.subplot()import matplotlib.pyplot as plt# Integer subplot specification must be a three digit number# 前两位代表横竖长度比# 左边的代表横,中间的代标纵坐标,右边的则表示绘图位置(当横纵比不是1:1时)ax1, ax2, ax3 = plt.subplot(231), plt..._integer subplot specification must be a three-digit number, not 6210

【速记宝典】K8S集群kubectl命令_kubectl get po -owide-程序员宅基地

文章浏览阅读330次。提示:记住使用率高的即可,其他现用现查create 通过文件名或者标准输入创建资源。expose 使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的k8s服务run 在集群中运行一个指定的镜像,也可能是副本set 为 objects 设置一个指定的特征run-container 在集群中运行一个指定的镜像...._kubectl get po -owide

HTTP Status 404(The requested resource is not available)的几种解决方法_http error 404. the-程序员宅基地

文章浏览阅读10w+次。原因:servlet没有配置正确 ,查看web.xml确认正确,以及自己的请求路径正确在IE中提示“404”错误有以下三种情况1.未部署Web应用2.URL输入错误 排错方法:首先,查看URL的IP地址和端口号是否书写正确。 其次,查看上下文路径是否正确 Project--------Properties------MyEli_http error 404. the