begin:

  1. 先看一下当前数据库服务支持什么引擎(作者的是mysql数据库服务)
show engines





mysql上表里面固定时间段的数据并进行数据导出 mysql时间表示_mysql


可以看到所有的存储引擎(YES表示支持的,NO表示不支持的)

2.查看当前mysql服务的默认存储引擎


show variables like '%storage_engine%'


mysql上表里面固定时间段的数据并进行数据导出 mysql时间表示_存储引擎_02


当前mysql服务相应地方使用的默认存储引擎,1代表永久表的默认存储引擎,2代表临时表的默认存储引擎,3不用关心,mysql已经废弃的字段,4表示的时临时表的默认存储引擎

3.查看当前某个表使用的什么存储引擎


show create table 你自己的表名


这条指令输出的表结构信息里面会有一条信息如:ENGINE=InnoDB 表示当前表使用的是什么引擎。这是我的查询结果,具体以自己的查询结果为准

浅谈mysql临时表

外部临时表:通过create temporary table创建的临时表,称为外部临时表,只对当前用户可见,当前会话结束,临时表会被自动关闭。临时表可以和非临时表同名,同名的情况下非临时表会被隐藏(对当前会话不可见),知道临时表改名或者被删除。
内部临时表:轻量级别的临时表,用来进行性能优化的,存储一些执行的中间结果,这种临时表对用户不可见,但是也存在相关的语法来获取explain和show status可以查看mysql是否使用了某些临时表来帮助完成某些操作。内部临时表当然也存在一些创建表和存储数据方面的开销 ,写sql的时候应该尽量避免用临时表


临时表的两种格式HEAP和OnDisk
HEAP:临时表的所有数据都放在内存里面,无io操作
OnDisk:数据存储在磁盘上,一般是保存一些中间计算结果比较大的操作,如果HEAP临时表的数据大于MAX_HEAP_TABLE_SIZE,
HEAP表会自动转换成OnDisk,internal_tmp_disk_storage_engine这个字段就是OnDisk的默认存储引擎


关键字执行顺序

sql语句中的每个关键字都按照顺序往下执行,而每一步操作会生成一个虚拟表,最后的虚拟表就是最终结果(虚拟表可以理解成上述临时表的内部临时表)

from->on->join(各种join)->where->group by->having->select->distinct->union->order by->limit

根据下面的这句sql来解释一下关键字的具体执行顺序


SELECT


mysql上表里面固定时间段的数据并进行数据导出 mysql时间表示_mysql_03

student表数据

mysql上表里面固定时间段的数据并进行数据导出 mysql时间表示_存储引擎_04

teacher表数据

from:对from左右的表计算笛卡儿积,生成虚拟表VT1


mysql上表里面固定时间段的数据并进行数据导出 mysql时间表示_mysql_05

from关键字执行之后生成的VT1

on:对VT1表进行筛选,只有哪些符合条件的才会留下来,生成VT2


mysql上表里面固定时间段的数据并进行数据导出 mysql时间表示_mysql_06

ON条件后生成的VT2

join:对未匹配的行作为外部行添加到虚拟表中,生成VT3(此处的例子是left join,其他的join方式读者可以自己尝试,顺便推荐一个讲解各种

join特别好的博客: mysql 各种join)


mysql上表里面固定时间段的数据并进行数据导出 mysql时间表示_存储引擎_07

join之后生成的VT3

where:对join之后的虚拟表进行再一次的筛选,满足条件的留下,生成VT4


mysql上表里面固定时间段的数据并进行数据导出 mysql时间表示_mysql_08

where条件判断之后的VT4

group by:对VT4里面的数据根据某个字段进行分组,生成VT5


mysql上表里面固定时间段的数据并进行数据导出 mysql时间表示_存储引擎_09

group by分组之后生成的VT5

having:对分组后的数据进行筛选,生成VT6


mysql上表里面固定时间段的数据并进行数据导出 mysql时间表示_mysql表示在某个时间段内_10

分组之后having条件过滤生成的VT6

distinct:对VT6中的数据去重,生成VT7

由于此处举例的sql没有用到distinct字段,故不做结果图片展示,大家可以根据自己的实验结果验证

union:有union操作就执行union操作,生成VT8

由于此处举例的union没有用到distinct字段,故不做结果图片展示,大家可以根据自己的实验结果验证

order by:把VT8根据某个字段排序,生成VT9


mysql上表里面固定时间段的数据并进行数据导出 mysql时间表示_字段_11

把得到的结果根据age升序排列后得到VT9

limit:取出指定的行记录,生成VT10,返回结果


mysql上表里面固定时间段的数据并进行数据导出 mysql时间表示_mysql表示在某个时间段内_12

取出指定的行记录生成的VT10作为返回结果