drop table

  • 这里先介绍一下【InnoDB】存储表空间概念:

Innodb存储引擎,可将所有的数据库数据存放于【ibdata1】的共享表空间;也可以将每张表存放于独立的.idb文件的独立表空间

(共享表空间和独立表空间都是针对数据的存储方式而言的。)

》共享表空间:某一个数据库的所有表数据都存放在一个文件中,默认这个共享表空间的文件路径在data目录下。

  默认的文件名【ibdata1】,初始化为10M。

》独立表空间:每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个【.frm】表描述文件,还有一个【.ibd】文件。

  其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中。
  • 在【mysql】配置文件中有一个参数【innodb_file_per_table】,可以用来控制【innodb】对于表数据的存储规则。
》设置为ON:表示为每个innodb的表数据存在一个单独的【.idb】文件中。
在【drop table】的时候系统就会直接删除【.idb】文件,系统磁盘空间自然就释放了。 》设置为OFF:表示为所有表数据存放在系统共享表空间中,也就是跟数据字典放在一起。
  • 共享表空间和独立表空间的优缺点比较:
    • 共享表空间

优点:可以将表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小限制,如一个表可以分布在不同的文件上)。数据和文件在一起方便管理

缺点:对于统计分析、日志系统这类应用不适合用共享表空间,因为多个表及索引在表空间混合,大量删除操作后会造成大量空间间隙。

    • 独立表空间

优点:

1》每个表都有自己的独立空间

2》每个表的数据和索引都存在自己的独立空间

3》可以实现表在不同的数据库中移动

4》空间可以回收:

a.【drop table】可以自动回收表空间

b.删除大量数据后,可通过指令【alter table [tablename] engine=innodb】重建表,来回缩空间

c.对于【innodb-plugin 的 innodb】,使用指令【turncate table】也会使空间收缩

d.独立空间表的使用,表空间的随便不会太影响全局性能,也方便处理

  • 现在我们可以说说【drop table】方式删除数据:
drop table #操作会删除所有表数据以及结构

delete table

  • 数据的删除流程:

1》MySQL在删除一条记录的时候,只是把这行记录标记为删除,但不会回收磁盘空间,被标记删除的位置可以被复用;

2》所以说【delete】命令只是把记录的位置或者数据页标记为【可复用】,但磁盘大小不会改变。这些可复用而没有使用的空间,看起来像个【空洞】。

  • 所以此时可能会出现表空间不释放的问题

不止删除会造成数据空洞,插入数据也会,如果数据是随机插入的,就可能会造成索引的数据页分裂。

上图是一个分裂前的B+Tree,此时B+Tree分裂后:

  • 重建表可以解决存在很多【空洞】的问题,从而收缩空间
alter table A engine = InnnDB  #可以重建表

【MySQL】详细说下MySQL删除数据的过程是什么样的?的更多相关文章

  1. mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功

    mysql 控制台环境下查询中文数据乱码,插入.更新中文数据不成功         登录mysql密码是加入编码参数--default-character-set,中文用gbk mysql -uroo ...

  2. 【MySQL】Linux下MySQL 5.5、5.6和5.7的RPM、二进制和源码安装

      [MySQL]Linux下MySQL 5.5.5.6和5.7的RPM.二进制和源码安装 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后, ...

  3. MySQL插入,更新,删除数据

    插入 单行插入 1.insert into 表名 values(col1_value,col2_value,...); 每个列必须提供一个值,如果没有值,要提供NULL值 每个列必须与它在表中定义的次 ...

  4. (笔记)Mysql命令drop table:删除数据表

    drop table命令用于删除数据表. drop table命令格式:drop table <表名>; 例如,删除表名为 MyClass 的表:    mysql> drop ta ...

  5. mysql——插入、更新、删除数据(概念)

    一.插入数据 1.为表的所有字段插入数据 -------------------------------------------------------------------------- (1)i ...

  6. MySQL插入、更新、删除数据

    1.插入数据:由于下表的id会自增,故赋值null. 注意:字符串用'   '单引号,不能双引号,英文状态下. 可以写上部分属性名进行插入操作,如bookTypeId没写,默认NULL. 也可以写上所 ...

  7. 【MySQL】Linux下mysql安装全过程——小白入门篇(含有问题详解)

    本次安装操作在申请的腾讯云上实现(版本:CentOS Linux release 7.4.1708 (Core) ). 根据教程实现(中途各种挖坑,填坑...),地址:http://www.runoo ...

  8. MySQL<添加、更新与删除数据>

    添加.更新与删除数据 添加数据 为表中所有字段添加数据 INSERT INTO 表名(字段名1,字段名2,……) VALUES(值1,值2,……); insert into 表名 values(值1, ...

  9. mysql——插入、更新、删除数据(示例)

    插入数据 一.前提,新建表: ), sname ), sage ), ssex ) ); select * from student; 二.多种方式插入数据: ','zhaolei','1990-01 ...

随机推荐

  1. React-Native iOS真机调试(新版)

    2019独角兽企业重金招聘Python工程师标准>>> React-Native iOS真机调试 看到网上很多以前的文章 找到两种方法 一 修改AppDelegate 把URL的替换 ...

  2. 细数阿里云在使用 Docker 过程中踩过的那些坑

    昨天下午道哥在微信上丢给我一条新闻,看看,我们阿里云支持 Docker 企业版了.我打开一看,果然,阿里云发布了飞天敏捷版,开始支持企业级的 Docker 容器. 美国中部时间4月19日,阿里云在容器 ...

  3. 剑指offer---05---用栈实现队列

    题意 给了两个栈去实现队列   分析 两个栈如下情况       1       2 4    3 这个时候就不能够把4插入到第二个弹出栈了否则弹出顺序出错. 所以这个时候就应该等第二个栈空了的时候再 ...

  4. 基于opencv的人脸识别程序

    1. 解析opencv自带人脸识别源码(……/opencv-3.1.0/samples/cpp/facedetect.cpp) @ 操作系统:Ubuntu 15.04 OpenCV版本:3.1.0 # ...

  5. while持续输入的几种常用使用方法

    while(scanf("%d,&n")!=EOF) 如果n被成功读入,则返回值为1, 如果n未被成功读入,则返回值为0, 如果遇到错误或遇到end of file,返回值 ...

  6. GUI_DOWNLOAD 下载乱码

    状况: 开发者打开正常,跨公司或跨企业打开异常. 跨App上传格式异常. 解决上述问题步骤: 1.用浏览器或可改变文件编码格式切换的软件打开文件(其他app上传正常文档格式,或跨公司打开正常文件)查看 ...

  7. neo4j在docker容器环境中无法启动的问题

    回去过了个周末,neo4j就无法启动了 数据还没备份出来,着急啊.上周回去前刚刚在研究怎么把数据导出来,尝试了一些容器导出的方法,没有成功.周一回来就无法启动了... 表现为启动后过几十秒又变为sto ...

  8. C# 数据操作系列 - 3. ADO.NET 离线查询

    0. 前言 在上一篇中,我故意留下了查询的示范没讲.虽然说可以通过以下代码获取一个DataReader: IDataReader reader = command.ExecuteReader(); 然 ...

  9. C语言进阶_分支语句

    勇气是在压力之下展现出的优雅. 一.简介 C语言提供了两种分支语句可供选用,一是if.......else....类型,一种是Switch语句.两种语句都能根据条件判断结果执行不同的指令,且能进行替换 ...

  10. C#实现前向最大匹、字典树(分词、检索)

    场景:现在有一个错词库,维护的是错词和正确词对应关系.比如:错词“我门”对应的正确词“我们”.然后在用户输入的文字进行错词校验,需要判断输入的文字是否有错词,并找出错词以便提醒用户,并且可以显示出正确 ...