临时表

MySQL临时表

假如想象 提交于 2020-04-07 17:18:31
概述 MySQL中临时表主要有两类,包括外部临时表和内部临时表。 外部临时表是通过语句create temporary table...创建的临时表,临时表只在本会话有效,会话断开后,临时表数据会自动清理。 内部临时表主要有两类,一类是information_schema中临时表,另一类是会话执行查询时,如果执行计划中包含有“Using temporary”时,会产生临时表。 内部临时表与外部临时表的一个区别在于,我们看不到内部临时表的表结构定义文件frm。 而外部临时表的表定义文件frm,一般是以#sql{进程id}_{线程id}_序列号组成,因此不同会话可以创建同名的临时表。 临时表 临时表与普通表的主要区别在于是否在实例,会话,或语句结束后,自动清理数据。 比如,内部临时表,我们在一个查询中,如果要存储中间结果集,而查询结束后,临时表就会自动回收,不会影响用户表结构和数据。 另外就是,不同会话的临时表可以重名,所有多个会话执行查询时,如果要使用临时表,不会有重名的担忧。 5.7引入了临时表空间后,所有临时表都存储在临时表空间(非压缩)中,临时表空间的数据可以复用。 临时表并非只支持Innodb引擎,还支持myisam引擎,memory引擎等。 因此,临时表我们看不到实体(idb文件),但其实不一定是内存表,也可能存储在临时表空间中。 临时表 VS 内存表

将存储过程的结果插入临时表

泪湿孤枕 提交于 2020-04-05 20:52:23
问题: How do I do a SELECT * INTO [temp table] FROM [stored procedure] ? 如何 SELECT * INTO [temp table] FROM [stored procedure] 进行 SELECT * INTO [temp table] FROM [stored procedure] ? Not FROM [Table] and without defining [temp table] ? 不是 FROM [Table] ,也没有定义 [temp table] ? Select all data from BusinessLine into tmpBusLine works fine. 从 BusinessLine Select 所有数据到 tmpBusLine 可以正常工作。 select * into tmpBusLine from BusinessLine I am trying the same, but using a stored procedure that returns data, is not quite the same. 我正在尝试相同的方法,但是使用返回数据的 stored procedure 并不完全相同。 select * into tmpBusLine from exec

sql语句性能优化

社会主义新天地 提交于 2020-04-03 21:37:55
面试的时候被面试官问到sql语句的性能优化,回来百度才发现我了解的那些真的是凤毛麟角,废话不多说,上干货: 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2,应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。 3,应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。 4,应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描, 可以 使用UNION合并查询: select id from t where num=10 union all select id from t where num=20 5,in 和 not in 也要慎用,否则会导致全表扫描,对于连续的数值,能用 between 就不要用 in 了:Select id from t where num between 1 and 3 6,下面的查询也将导致全表扫描:select id from t where name like ‘%abc%’ 或者select id from t

php常用的优化手段

孤街醉人 提交于 2020-04-02 06:25:22
由于工作码成狗,抽闲整理了下内容, 以下是网上流传比较广泛的30种SQL查询语句优化方法: 1、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 2、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 3、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 4、尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num=10 or num=20 可以这样查询: select id from t where num=10 union all select id from t where num=20 5、下面的查询也将导致全表扫描:(不能前置百分号) select id from t where name like '%abc'; 若要提高效率,可以考虑全文检索。 6、in 和 not in 也要慎用,否则会导致全表扫描,如:

oracle 常用调优方法

你。 提交于 2020-04-02 05:57:25
Oracle 数据库应用系统的调优主要包括十个方面: (1)、优化 数据库 内存; (2)、在Oracle共享池中固定应用程序代码; (3)、优化数据存储; (4)、优化数据排序的技术; (5)、优化 SQL 语句; (6)、优化回退段; (7)、优化索引; (8)、优化磁盘I/O; (9)、定期生成数据库对象的状态统计信息; (10)、优化操作系统环境。 其实质就是降低CPU负载、改善I/O性能。 1、化磁盘I/O 数据库的作用就是实现对数据的 管理 和查询,所以必然存在对数据的大量读写操作,其I/O问题也往往是导致Oracle数据库性能问题的重要原因。 1.1、Oracle中I/O的产生 1.2、优化OS存储 一、在UNIT环境下,采用裸设备(Raw Device)作为Oracle数据文件的存储设备比采文件系统(File System)存储Oracle数据文件具有较高的读写效率。 二、采用异步IO(Asynchronous IO)方式。在异步IO模式下,进程发出IO请求后无需等待IO完成,可以去处理其它事情;IO请求被放入一个队列中,一旦IO完成,系统会发出信号通知进程。异步IO可以使需要大量写的Oracle进程(如DBWn进程)将IO请求队列化,以充分利用硬件的IO带宽,从而使它们能最大程度实现并行处理。确认操作系统已经设置支持AIO后,还需要设置Oracle初始化参数

【20190404】MySQL疑难杂症-1034

泪湿孤枕 提交于 2020-03-30 11:45:01
目的 写文章的目的只是为了记录一下工作中遇到的一些实际问题,方便后续自己的复习。 问题描述 收到来自于开发的一个问题描述,说是在UAT环境给一张表加一个字段,但是怎么操作都是错误,如图: 问题解析 其实第一眼看上去的时候,这个错误信息给我的感觉就是这个表的数据字典出了问题,需要进行修复,但是执行下面操作的时候一直是提示是失败,这个时候就需要求助强大的google的了,通过google了一番的话,大部分提示都是和临时表的表空间有关联。 通过上面的截图我们可以很明显的看到这张表的磁盘大小是5G以上,由于是online 添加字段所以肯定是会创建临时表的,但是临时表是在根目录下面的 /tmp下面,可以看到根目录剩下的空间只有2.9G,没有足够的空间创建临时表的 。所以才会抛出上述的这个错误信息。 问题解决 将根目录下面的一些磁盘空间清楚,保证有足够的空间在线执行online DDL,建议最好是线下无业务的时候执行,不推荐这种方式在数据量比较大的时候。 使用percona的pt-online-schema-change命令。 来源: 51CTO 作者: liuhuang9496 链接: https://blog.51cto.com/11819159/2374043

SQL注入--盲注及报错注入

时间秒杀一切 提交于 2020-03-26 15:28:41
3 月,跳不动了?>>> 盲注查询 盲注其实就是没有回显,不能直观地得到结果来调整注入数据,只能通过其他方式来得到是否注入成功,主要是利用了一些数据库内置函数来达到的 布尔盲注 布尔很明显Ture跟Fales,也就是说它只会根据你的注入信息返回Ture跟Fales 其实登录处的注入就是布尔型的,万能密码就是构造一个永真的查询,比如下面的 select user from test where passwd=‘{injuct}’; #构造永真,即令where的条件用于为真 select user from test where passwd=‘aa‘or’1’=‘1’; #注入的数据是aa‘or’1’=‘1 密码输入无论是否正确,查询都成立。 布尔盲注其实就是利用了这种,我们什么时候需要采用这种呢 1)当没有数据输出点时,我们没有办法直观的判断注入的sql执行情况, 2)有正确或者错误的两种返回,比如查询正确返回一个页面,失败返回另一个页面,但是没有数据 时间盲注 界面返回值只有一种,true 无论输入任何值 返回情况都会按正常的来处理。加入特定的时间函数, 通过查看web页面返回的时间差来判断注入的语句是否正确 。 利用的内置函数 sleep(n):将程序挂起一段时间 n为n秒 if(expr1,expr2,expr3):判断语句

38 是否要使用memory引擎的表

£可爱£侵袭症+ 提交于 2020-03-23 12:47:00
38 是否要使用 memory 引擎的表 内存表的数据组织结构 create table t1(id int primary key, c int) engine=Memory; create table t2(id int primary key, c int) engine=innodb; insert into t1 values(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(0,0); insert into t2 values(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(0,0); 可以看到,内存表 t1 的返回结果里面 0 在最后一行,在 innodb 表 t2 的返回结果, 0 在第一行,二者的差别要从他们的 主键索引 的组织方式说起。 表 t2 是 innodb 表,是主键索引 id 的方式, innodb 表的数据放在主键索引树上,是一个 B+ tree ,如下 主键索引上的值是 有序 存储的,在 select * 的时候,就会按照叶子节点上从左往右扫描,所以结果里 0 在第一行。 与 innodb 不同, memory 引擎的数据和索引是分开的, 可以看到,内存表的数据部分以数组的方式单独存放,而主键 id 索引里,存的是每个数据的位置

存储过程中的循环使用

百般思念 提交于 2020-03-21 13:25:34
以前一直使用存储过程,但是从没有自己写过一些关于循环语句的存储过程,今天就把我写的一些代码拿出来给大家分享 代码举例: /****** 对象: 存储过程 dbo.get_zb_count 脚本日期: 2007-05-18 15:34:33 ******/ CREATE PROCEDURE get_zb_count_3 @J_JID varchar(50), @S_Area varchar(6000), @K_ID varchar(50), @zb_count int output AS begin declare @i int ---存放循环变量 declare @count int ---存放表的数据记录数 declare @Kh_ID varchar(50)-----存放考核子指标值 declare @total int ------存放count的循环累计 create table #KhStyle(IntID int identity(1,1), StyleID varchar(50)) ---创建临时表 insert into #KhStyle(StyleID) select K_ID from T_Kaoh where J_JID=@J_JID and K_FID=@K_ID --------把查询的子指标记录插入到临时表 select @count = count(1