目录

使用 MySQL 临时表查询连号记录

项目中导出数据使用临时表

在项目中有一个导出数据的需求,需要找出某个字段连号记录,也就是连续值

比如,字段a,有一个数据是123,如果另外行有数据是124,这就算是连续值

项目要求是需要上下五个,也就是值加5和减5

数据在多个表中存储,需要关联查询,同时把连续的数据和一个唯一号用 “_” 关联起来一起查询出来,脱敏后的查询语句如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
SELECTa.BUS_NO '单号',(
	SELECTGROUP_CONCAT (
	CONCAT_WS( '_', tii.BUS_NO, tii.INO_NUM )) 
	FROM
		t_ino tii,
		t_clo tt 
	WHERE
		tii.CLO_ID = tt.CLO_ID 
		AND tii.ino_id != ti.ino_id 
	AND ( ti.INO_NUM BETWEEN tii.INO_NUM - 5 AND tii.INO_NUM + 5 )) '连续值数据' 
FROM
	t_clo a
	INNER JOIN t_ino ti ON a.CLO_ID = ti.CLO_ID

CONCAT_WS 将同一行的多个字符串连接成一个字符串

GROUP_CONCAT 对多个行数据进行拼接处理

这样每次查询都需要去关联表中扫描,查询巨慢无比

可以使用临时表先把需要关联查询时用到的三个字段,根据需要的条件查询保存到临时表中,然后直接关联临时表一个表数据就好

创建临时表:

1
CREATE TEMPORARY TABLE temp_ino_1 AS SELECT  CLO_ID, ino_id, INO_NUM from ……

实际使用查询时间缩短了 90% 以上

临时表和内存表的区别

创建语句:

临时表创建语句:CREATE TEMPORARY TABLE AS SELECT * from

内存表创建语句:CREATE TABLE table_name ENGINE=MEMORY AS SELECT * from

生命周期:

临时表只在本次连接中生效,连接关闭自动删除

比如,在Navicat的一个查询窗口界面创建一个临时表时,别人是无法看到的这个表,把Navicat的这个查询窗口界面关闭时,表会被自动删除

内存表创建后,是在多个连接共享,都可以看到这个表,MySQL 服务器重启后也会自动删除

存储位置:

MySQL的两个参数:

tmp_table_size:临时表的默认最大大小,默认值16M

max_heap_table_size:内存表的默认最大大小,默认值16M

查询参数值:

1
2
3
SHOW VARIABLES LIKE 'tmp_table_size';

SHOW VARIABLES LIKE 'max_heap_table_size';

数据没有超过 max_heap_table_size 大小,内存空间足够都会在内存中创建,否则存储在磁盘上