MySQL内核月报 2014.09-MySQL· 引擎差异·create_time in status

简介:

背景

  在MySQL数据库中,我们利用show table status命令可以得到表的状态信息,其中一列信息为create_time,表示表的创建时间。对于不同的存储引擎(如InnoDB/MyISAM/MEMORY)我们都能得到create_time的数值。我们知道不同的存储引擎表的文件结构是不同的,因此实现表的创建时间create_time的机制也是不同的。下面着重探讨InnoDB和MyISAM在create_time上的区别。

实验

  我们先做一些实验来看看create_time的特点。在InnoDB引擎下创建一个表:

 

  在MyISAM引擎下也创建结构相同的一个表,如何可以更新create_time呢?我们在表上做以下3种操作,观察create_time的变化。

  1. 对表进行增删改查操作,InnoDB、MyISAM的create_time不变。

  2. 对表进行alter table add column e varchar(32),InnoDB、MyISAM的create_time都更新到当前时间。

  3. 对表进行truncate table tb,InnoDB的create_time不变、MyISAM的create_time更新到当前时间。

  通过这些操作我们发现虽然2种引擎的内部实现不同,但前2种操作的现象是一样的。对表进行增删改查并不重建表,因此create_time没有更新。而alter table会更新create_time的原因是新建了一个原表的副本,在副本上实现alter table的功能(增加新列等等),最后删除原表,用副本替代原表。因此alter table下create_time是原表副本的创建时间。

  第3种操作,两者的现象不同,这是为什么呢?我们从代码实现上分析原因。


show table status的create_time的实现

1.InnoDB

  在InnoDB下执行show table status获得create_time来自于代码:

 

  stats.create_time最终来自于以下代码的statinfo变量:

 

  stat为C语言的库函数,含义是将文件路径path定位的文件(TABLENAME.frm)的状态信息(包括了创建时间create_time)存入statinfo。

  通过对源码的分析,我们知道在InnoDB引擎,create_time来源于.frm文件的创建日期。在truncate table之后,InnoDB并没有重建.frm文件,因此show table status的create_time不变。

2. MyISAM下

  在MyISAM下执行show table status获得create_time来自于代码:

 

  对应的misam_info.create_time来源于:

 

  即MyISAM通过读.MYI文件来获得state信息(包含了create_time),也就是说MyISAM下show table status的create_time最终来源于MYI文件中的state信息。

  在MyISAM下,创建表(create table..)的create_time来源于以下代码:

 

  MyISAM下的create_time来源于share变量,每次执行这部分代码都会更新share.state.create_time。share是MyISAM引擎下的全局信息,share.state区间信息包含了键和数据文件长度、时间戳(即create_time)和打开表的次数等等参数。share.state会记入MYI文件,代码如下:

 

  执行truncate table也会经过以上2处的代码,更新.MYI文件的state区间的信息,然后show table status时读入.MYI文件最新的state信息(包含了create_time),因此create_time会被更新。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
11月前
|
SQL 存储 关系型数据库
MySQL内存引擎:Memory存储引擎的适用场景
MySQL Memory存储引擎将数据存储在内存中,提供极速读写性能,适用于会话存储、临时数据处理、高速缓存和实时统计等场景。但其数据在服务器重启后会丢失,不适合持久化存储、大容量数据及高并发写入场景。本文深入解析其特性、原理、适用场景与限制,并提供性能优化技巧及替代方案比较,助你合理利用这一“内存闪电”。
|
11月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1649 152
|
11月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1125 156
|
11月前
|
存储 关系型数据库 MySQL
介绍MySQL的InnoDB引擎特性
总结而言 , Inno DB 引搞 是 MySQL 中 高 性 能 , 高 可靠 的 存 储选项 , 宽泛 应用于要求强 复杂交易处理场景 。
430 15
|
11月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
存储 SQL 缓存
mysql数据引擎有哪些
MySQL 提供了多种存储引擎,每种引擎都有其独特的特点和适用场景。以下是一些常见的 MySQL 存储引擎及其特点:
358 0
|
11月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
624 158
|
11月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
11月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
726 156

相关产品

  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多