引用连接:https://www.cnblogs.com/duanxz/p/3724120.html

对于innodb存储引擎而言,其数据文件最小的存储单位为页。默认为16KB大小。在页的基础上又分为区,段,和表空间。innodb存储引擎对于空间的申请不是每次以16KB的方式申请,而是以区的方式。一个区的大小为1MB,总共有64个页。这样的目的是提高空间的申请效率。如果数据是按照减值顺序存放的,那么读取这些页,将在一个连续的地址中,这样可以避免磁头的大量的寻址时间。

1.表空间

 1. 一个逻辑概念,由之前的页,区,段组成,一个表空间可以由多个文件组成。

2. 使用共享表空间存储方式时,Innodb的所有数据保存在一个单独的表空间里面。

3. 而在使用单独表空间存储方式时,每个表的数据以一个单独的文件来存放。

开启独立表空间的参数: innodb_file_per_table =1

2.Innodb与myisam表文件比较及其他文件说明

Innodb独立表空间文件里表结构文件t1.frm .
   表的数据文件:t1.ibd(--数据+索引)

[root@lbg test1]# ll t1*
-rw-r----- 1 mysql mysql  8586 Oct 13 01:01
t1.frm
-rw-r----- 1 mysql mysql 98304 Oct 15 21:09 t1.ibd

mysql> show create table
test1;    -----查看创建表语句.

创建myisam的表test4:

CREATE TABLE
`test4` ( `id` int(11) ,  `name` varchar(10)
 ) ENGINE=myisam

[root@lbg test1]# ll test4*
-rw-r----- 1 mysql mysql 8586 Oct 17 23:35 test4.frm
-rw-r----- 1 mysql mysql   
0 Oct 17 23:35 test4.MYD
-rw-r----- 1 mysql mysql 1024 Oct 17 23:35 test4.MYI

MyISAM数据文件: test4.frm  ---二进制的表结构文件.
  
test4.MYD  --myisam的数据data文件.
    
test4.MYI   --myisam的索引index文件.
可知Myisam存储引擎的
数据和索引分开存放.

ibdata1
是innodb的系统表空间.
 ibtmp1是临时表空间.
 ib_buffer_pool是放数据预热的文件.
 文件auto.cnf记录的是数据库server的uuid(唯一标识符.)

3.配置多个系统表空间的操作

 ibdata1 只能扩大不能缩小,路径:/home/mysql3307/mysql3307/ibdata1

ibdata1是可以配置多个:innodb_data_home_dir设置为空,

原文件信息:

innodb_data_home_dir
           =
/home/mysql3306/mysql3306/

innodb_data_file_path
          =
ibdata1:512M:autoextend

修改后信息:

innodb_data_home_dir
 =

innodb_data_file_path

     
     
 
/home/mysql3307/mysql3307/ibdata1:512M;/home/mysql3307/mysql3307/ibdata2:512M:autoextend

两个路径之间用分号隔开.只允许最后一个表空间文件进行自动扩展.

 

2.段

1. 每个用户至少有两个段

2. 一个是聚集索引的叶子节点段

3. 非叶子节点段

4. 段根据区的形式组织存储空间

3.区(按区分配储存空间)

1. 区是innodb存储引擎访问的最小单位

2.区是innodb寻找存储空间的最小单位。

3.一个区有64个连续的页组成,大小为1MB。



4.页(
据库I/O的基本单位,16KB)

1. 就是MySQL的聚簇索引的叶子节点

2. 每个数据页默认是16KB

3. 物理上64个连续的页面可以连成一个区

4. 数据页、Undo页、系统页、事务数据页、插入缓冲位图页等

5。统计每个表大小

SELECT TABLE_NAME,SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024 AS
TOTAL_SIZE

FROM
information_schema.TABLES

WHERE
TABLE_SCHEMA='test' GROUP BY TABLE_NAME;

6.什么是表碎片及表空间碎片的判断及清除

表在不断的使用中,尤其是多DML的环境中,会因为不断的分配,回收空间而产生很多碎片,如果碎片过多,很造成磁盘性能的影响。

1. 一般有较多的DML操作的表,是值得注意的,因为这些数据频繁的表动,需要进行空间的再分配,容易产生大量的碎片

2. 有些数据量很大的表,但是在业务上几乎没有用到delete的那种,即使很大,也可能没啥碎片

3. 有varchar类型的列比较多的需要注意,该数据类型容易造成表空间碎片

4. 表碎片的回收时间很长,不会要经常进行此类操作

5. 表碎片没有可以准确度量的公式

统计表的碎片数字:单位是字节

select table_schema, table_name, data_free, engine

from information_schema.tables

where table_schema not in ('information_schema', 'mysql') and
data_free > 0;

表空间碎片的清除:

1.一般表 alter table TableName
engine=innodb;

回收表空间,对于大表就不能直接采用这种方式,因为会造成长时间的锁表。

2.大表

可以先建立新表,然后进行抽取数据,然后修改表名

可以采用新建表转移数据,然后删除旧表的形式,然后再重命名表。

7.truncate drop delete的区别

truncate 删除数据同时立即清除空间

Drop 删除表结构,删除数据,清除空间

Delete 进行标记
  记录进行删除

8.临时表空间

 临时表分:外部临时表和内部临时表

外部临时表

通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭。这种临时表的命名与非临时表可以同名(同名后非临时表将对当前会话不可见,直到临时表被删除)。

内部临时表:

是一种特殊轻量级的临时表,用来进行性能优化。这种临时表会被MySQL自动创建并用来存储某些操作的中间结果。这些操作可能包括在优化阶段或者执行阶段。这种内部表对用户来说是不可见的,但是通过EXPLAIN或者SHOW...
STATUS可以查看MYSQL是否使用了内部临时表用来帮助完成某个操作。

内部临时表有两种类型:一种是HEAP(堆)临时表,这种临时表的所有数据都会存在内存中,对于这种表的操作不需要IO操作。另一种是OnDisk临时表,顾名思义,这种临时表会将数据存储在磁盘上。OnDisk临时表用来处理中间结果比较大的操作。如果HEAP临时表存储的数据大于MAX_HEAP_TABLE_SIZE,HEAP临时表将会被自动转换成OnDisk临时表。OnDisk临时表在5.7中可以通过INTERNAL_TMP_DISK_STORAGE_ENGINE系统变量选择使用MyISAM引擎或者InnoDB引擎。

MySQL在以下几种情况会创建临时表:

1、UNION查询;

2、用到TEMPTABLE算法或者是UNION查询中的视图;

3、ORDER
BY和GROUP
BY的子句不一样时;

4、表连接中,ORDER
BY的列不是驱动表中的;

5、DISTINCT查询并且加上ORDER
BY时;

6、SQL中用到SQL_SMALL_RESULT选项时;

7、FROM中的子查询;

8、子查询或者semi-join时创建的表;

在以下几种情况下,会创建磁盘临时表:

1、数据表中包含BLOB/TEXT列;

2、在 GROUP
BY 或者 DSTINCT 的列中有超过
512字符
的字符类型列(或者超过 512字节的
二进制类型列,在5.6.15之前只管是否超过512字节);

3、在SELECT、UNION、UNION ALL查询中,存在最大长度超过512的列(对于字符串类型是512个字符,对于二进制类型则是512字节);

4、执行SHOW
COLUMNS/FIELDS、DESCRIBE等SQL命令,因为它们的执行结果用到了BLOB列类型。

从5.7.5开始,新增一个系统选项
internal_tmp_disk_storage_engine
可定义磁盘临时表的引擎类型为 InnoDB,而在这以前,只能使用
MyISAM。而在5.6.3以后新增的系统选项 default_tmp_storage_engine 是控制 CREATE TEMPORARY
TABLE 创建的临时表的引擎类型,在以前默认是MEMORY,不要把这二者混淆了。

 
 

Innodb之(临时)表空间、段、区、块的更多相关文章

  1. InnoDB 引擎独立表空间 innodb_file_per_table

    使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构.表索引.表数据空间.我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作.然而当你 ...

  2. InnoDB 引擎独立表空间

    InnoDB 引擎独立表空间   使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构.表索引.表数据空间.我们可以将某个数据库目录直接迁移到 ...

  3. mysql InnoDB引擎 共享表空间和独立表空间(转载)

    PS:innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间. 1.什么是共享表空间和独占表空 ...

  4. INNODB存储引擎表空间

    这片文章主要是对innodb表空间的一些说明: innodb中表空间可以分为以下几种: 系统表空间 独立表空间 undo表空间 临时表空间(temporary tablespace) 通用表空间(ge ...

  5. MySQL Innodb Engine --独立表空间参数(innodb_file_per_table)

    MySQL中参数innodb_file_per_table决定将表存放于ibdata*的共享表空间还是独立的.ibd文件的独立表空间. ================================ ...

  6. 15.3、mysql之InnoDB和MyISAM表空间详解

    15.3.1.InnoDB引擎表空间: 1.表空间分类: 共享表空间: 某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在 data目录下. 默认的文件名为:ibd ...

  7. MySQL另类的备份恢复方法——innodb可传输表空间

      Preface       There're many ways in backing up or migrating data from one server to another one.Lo ...

  8. 【Oracle 】tablespace 表空间创建和管理

    1.表空间的概述 1. 表空间是数据库的逻辑组成部分. 2. 从物理上讲,数据库数据存放在数据文件中: 3. 从逻辑上讲,数据库是存放在表空间中,表空间由一个或者多个数据文件组成. 2.oracle的 ...

  9. Oracle 高水位说明和释放表空间,加快表的查询速度

    高水位的介绍 数据库运行了一段时间,经过一些列的删除.插入.更改操作有些表的高水位线就有可能和实际的表存储数据的情况相差特别多,为了提高检索该表的效率,建议对这些表进行收缩: 查找高水位线的表 查找表 ...

随机推荐

  1. MeteoInfo脚本示例:读取FY3A AOD HDF文件

    FY3A卫星有AOD产品数据,HDF格式,这里示例用MeteoInfo脚本程序读取和显示该类数据. 脚本程序如下: #----------------------------------------- ...

  2. 【暑假集训】HZOI2019 Luogu P1006 传纸条 二三四维解法

    写三次丢失两次,我谔谔,以后再不在博客园先保存我就去死 题目内容 洛谷链接 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学被安排坐成一个\(m\)行.\(n\ ...

  3. spring boot: 用thymeleaf嵌套循环展示多层数据(spring boot 2.3.2)

    一,什么情况下会用到嵌套循环? 当我们展示多个分类时,每个分类下又展示出推荐的前几个商品,   这时我们需要用到嵌套循环 看一个例子: 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https:/ ...

  4. centos8平台:举例讲解redis6的ACL功能(redis6.0.1)

    一,为什么redis6要增加acl功能模块? 什么是acl? 访问控制列表(ACL)是一种基于包过滤的访问控制技术, 它可以根据设定的条件对接口上的数据包进行过滤,允许其通过或丢弃 redis6增加了 ...

  5. 【应用服务 App Service】App Service 中部署Java应用中文乱码现象

    问题情形 有时候部署在 Azure  App Service的 Java应用会出现乱码 详细日志 无 问题原因 因为 App Service默认的编码为gbk,所以在显示页面或传递中文字符时就会出现乱 ...

  6. concurrenthasmap

    concur'renthashmap java1.7 hashMap在单线程中使用大大提高效率,在多线程的情况下使用hashTable来确保安全.hashTable中使用synchronized关键字 ...

  7. 手把手教你使用 cert-manager 签发免费证书

    概述 随着 HTTPS 不断普及,越来越多的网站都在从 HTTP 升级到 HTTPS,使用 HTTPS 就需要向权威机构申请证书,需要付出一定的成本,如果需求数量多,也是一笔不小的开支.cert-ma ...

  8. spring与缓存注解,以及encache缓存使用

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

  9. Go之NSQ简介,原理和使用

    NSQ简介 NSQ是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异. NSQ 是实时的分布式消息处理平台,其设计的目的是用来大规模地处理每天数以十亿计级别的消息.它具有分布式和去中心化 ...

  10. D. Bash and a Tough Math Puzzle 解析(線段樹、數論)

    Codeforce 914 D. Bash and a Tough Math Puzzle 解析(線段樹.數論) 今天我們來看看CF914D 題目連結 題目 給你一個長度為\(n\)的數列\(a\), ...