临时表

Mysql中Explain详解

爱⌒轻易说出口 提交于 2019-11-30 17:30:47
当我们使用索引的时候,通常会用explain来检查我们索引使用的情况。 id列: 这一列总是包含一个编号,标示select所属的行。如果在语句当中没有子查询或联合,那么只会有的select,于是每一个在这个列中都将显示一个1.否则,内层的select语句一般会顺序编号,对应与其在原始语句中的位置。 Mysql将select查询分为简单和复杂类型,复杂类型可分成三大类:简单子查询,所谓的派生表(在from字句中的子查询),以及union查询。 1、这个是简单的子查询: 2、from子句中的子查询和联合给id列增加了更多的复杂性。下面是一个from字句中的基本子查询。 这个查询语句执行时有一个匿名临时表。MySQL内部通过别名(der)在外层查询中引用这个临时表,在更复杂的查询中可以看到ref列。 3、下面是一个UNION查询。 Explain select 1 union all select 1; 注意union结果输出中的额外行。union结果总是放在一个匿名临时表中,之后MySQL将结果读取到临时表临时表外。临时表并不在原sql中出现,因此他的id列是null,与之前的例子相比(演示子查询的那个from字句中),从这个查询产生的临时表在结果中出现在最后一行,而不是第一行。 select_type列 这一列显示对应行是简单还是复杂的select(如果是后者

SQL Server 中关于系统库Tempdb总结

一个人想着一个人 提交于 2019-11-30 09:42:34
Tempdb系统数据库是一个全局资源,可供连接到SQL Server实例的所有用户使用。 存储的内容项: 1、用户对象 用户对象由用户显示创建。这些对象可以位于用户会话的作用域中,也可以位于创建对象所用例程的作用域中。例程可以是存储过程、触发器或用户自定义函数。用户对象可以是一下项内容之一: 用户定义的表和索引 系统表和索引 全局临时表和索引 table变量 表值函数中返回的表 2、内部对象 内部对象是根据需要由SQL Server数据库引擎创建的,用户处理SQL Server语句。内部对象可以在语句的作用域中创建和删除。内部对象可以是下列项之一: 用于游标或假脱机操作以及临时大型对象(LOB)存储的工作表 用于哈希连接或哈希聚合操作的工作文件 用于创建或重新生成索引等操作(如果指定了SORT_IN_TEMPDB)的中间排序结果,或者某些GROUP BY、ORDER BY或UNION查询的中间排序结果。 每个对象至少使用9页:一个IAM页,一个8页的区。 3、版本存储区 版本存储区是数据页的集合,它包含支持使用行版本控制的功能所需的数据行。主要用来支持快照(Snaphot)事务隔离级别,以及SQL Server2005推出的一些其它提高并法度的新功能。在SQL Server2005中,有两个版本存储区:公用版本存储区和索引生产版本区。包含以下内容:

Oracle 表空间的概念

回眸只為那壹抹淺笑 提交于 2019-11-30 09:30:59
Oracle 表空间的概念 表空间 在数据库系统中,存储空间是较为重要的资源,合理利用空间,不但能节省空间,还可以提高系统的效率和工作性能。 Oracle 可以存放海量数据,所有数据都在数据文件中存储。而数据文件大小受操作系统限制,并且过大的数据文件对数据的存取性能影响非常大。同时Oracle 是跨平台的数据库, Oracle 数据可以轻松的在不同平台上移植,那么如何才能提供统一存取格式的大容量呢? Oracle 采用 表空间 来解决。 表空间只是一个逻辑概念,若干操作系统文件(文件可以不是很大)可以组成一个表空间。表空间统一管理空间中的数据文件,一个数据文件只能属于一个表空间。一个数据库空间由若干个表空间组成。如图所示: Oracle 中所有的数据(包括系统数据), 全部保存在表空间中 ,常见的表空间有: Ø系统表空间:存放系统数据,系统表空间在数据库创建时创建。表空间名称为 SYSTEM。存放 数据字典 和 视图 以及数据库结构等重要系统数据信息,在运行时如 果 SYSTEM 空间不足,对数据库影响会比较大,虽然在系统运行过程中可以通过命 令扩充空间,但还是会影响数据库的性能,因此有必要在创建数据库时适当的把数 据文件设置大一些。 ØTMEP 表空间:临时表空间,安装数据库时创建,可以在运行时通过命令增大临时 表空间。临时表空间的重要作用是数据 排序 。比如当用户执行了诸如

MySQL索引&&开发规范

三世轮回 提交于 2019-11-30 05:38:15
规范总结 索引规范 默认添加的索引都是BTree索引。Innodb只支持BTree索引。 设计索引原则 - 最适合索引的列是WHERE子句中的列,而不是SELECT中的列。 - 如果索引的字段很长,使用前缀索引 - 删除不常用索引 - 建议单表不超过5个 单表索引不超过5个【索引可以提高查询效率,但是会减小插更新效率】 每个 Innodb 表必须有个主键,【主键建议使用自增 ID 值】 索引列建议 出现在 SELECT、UPDATE、DELETE 语句的 WHERE 从句中的列 包含在 ORDER BY、GROUP BY、DISTINCT 中的字段 并不要将符合 1 和 2 中的字段的列都建立一个索引, 通常将 1、2 中的字段建立联合索引效果更好 多表 join 的关联列 避免建立冗余索引和重复索引 重复索引示例:primary key(id)、index(id)、unique index(id) 冗余索引示例:index(a,b,c)、index(a,b)、index(a) 覆盖索引 to be continue 外键约束取舍 开发规范 禁止使用 SELECT * 必须使用 SELECT 查询 用join操作代替子查询 使用join关联的表最好不超过5个 对应同一列进行 or 判断时,使用 in 代替 or 禁止使用 order by rand() 进行随机排序

大数据量时Mysql的优化要点

空扰寡人 提交于 2019-11-29 14:01:37
如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。 虽然关系型数据库在海量数据中逊色于NoSQL数据库,但是如果你操作正确,它的性能还是会满足你的需求的。针对数据的不同操作,其优化方向也是不尽相同。对于数据移植,查询和插入等操作,可以从不同的方向去考虑。而在优化的时候还需要考虑其他相关操作是否会产生影响。就比如你可以通过创建索引提高查询性能,但是这会导致插入数据的时候因为要建立更新索引导致插入性能降低,你是否可以接受这一降低那。所以,对数据库的优化是要考虑多个方向,寻找一个折衷的最佳方案。 一:查询优化 1:创建索引。 最简单也是最常用的优化就是查询。因为对于CRUD操作,read操作是占据了绝大部分的比例,所以read的性能基本上决定了应用的性能。对于查询性能最常用的就是创建索引。经过测试,2000万条记录,每条记录200字节两列varchar类型的

mysql 通过存储过程批量更新表数据

有些话、适合烂在心里 提交于 2019-11-29 08:41:08
方法一:使用临时表批量更新表数据 (注意操作用户需要有mysql的创建临时表权限) delimiter $$ # 删除 已有的 存储过程 DROP PROCEDURE IF EXISTS update_user_account_method; # 创建新的存储过程 CREATE PROCEDURE update_user_account_method() -- 批量更新HIK+手机号 BEGIN # 批量更新sx_为xs_ UPDATE sys_user t SET t.account = REPLACE (t.account,'sx_','xs_'); # 创建临时表 -- 不存在则创建临时表 create temporary table if not exists tmp(id bigint(20) primary key,ac varchar(20) not null) ; -- 使用前先清空临时表 truncate table tmp; # 查询HIK的账户数 SET @num=(SELECT COUNT(1) FROM sys_user WHERE account like concat('%','HIK','%')); # HIK的账户数大于0则执行 if @num>0 then insert into tmp(id,ac) SELECT user_id,random

mysql常见的hint

限于喜欢 提交于 2019-11-29 08:08:36
mysql常用的hint 对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法。同样,在mysql里,也有类似的hint功能。下面介绍一些常用的。 强制索引 FORCE INDEX SELECT * FROM TABLE1 FORCE INDEX (FIELD1) … 以上的SQL语句只使用建立在FIELD1上的索引,而不使用其它字段上的索引。 忽略索引 IGNORE INDEX SELECT * FROM TABLE1 IGNORE INDEX (FIELD1, FIELD2) … 在上面的SQL语句中,TABLE1表中FIELD1和FIELD2上的索引不被使用。 关闭查询缓冲 SQL_NO_CACHE SELECT SQL_NO_CACHE field1, field2 FROM TABLE1; 有一些SQL语句需要实时地查询数据,或者并不经常使用(可能一天就执行一两次),这样就需要把缓冲关了,不管这条SQL语句是否被执行过,服务器都不会在缓冲区中查找,每次都会执行它。 强制查询缓冲 SQL_CACHE SELECT SQL_CALHE * FROM TABLE1; 如果在my.ini中的query_cache_type设成2,这样只有在使用了SQL_CACHE后,才使用查询缓冲。 优先操作 HIGH_PRIORITY

数据量太大的情况下,如何优化查询速度?

十年热恋 提交于 2019-11-29 05:37:13
1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下: ●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。 ●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。 ●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。 ●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。 ●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。 2.避免或简化排序 应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素: ●索引中不包括一个或几个待排序的列;

查询条件on、where、having区别

自古美人都是妖i 提交于 2019-11-29 04:59:38
ON 、WHERE、HAVING都是查询条件,但他们的使用及其不同。下面我们来分析三者之间的区别。 1.ON 和WHERE 所有的查询都回产生一个中间临时报表,查询结果就是从返回临时报表中得到。ON和WHERE后面所跟限制条件的区别,主要与限制条件起作用的时机有关,ON根据限制条件对数据库记录进行过滤,然后生产临时表;而WHERE是在临时表生产之后,根据限制条件从临时表中筛选结果。 因为以上原因,ON和WHERE的区别主要有下: 1)返回结果:在左外(右外)连接中,ON会返回左表(右表)中的所有记录;而WHERE中,此时相当于inner join,只会返回满足条件的记录(因为是从临时表中筛选,会过滤掉不满足条件的)。 2)速度:因为ON限制条件发生时间较早,临时表的数据集要小,因此ON的性能要优于WHERE。 2.HAVING和WHERE HAVING和WHERE的区别也是与限制条件起作用时机有关,HAVING是在聚集函数计算结果出来之后筛选结果,查询结果只返回符合条件的分组,HAVING不能单独出现,只能出现在GROUP BY子句中。;而WHERE是在计算之前筛选结果,如果聚集函数使用WHERE,那么聚集函数只计算满足WHERE子句限制条件的数据,例如: 在使用和功能上,HAVING和WHERE有以下区别: 1)HAVING不能单独出现,只能出现在GROUP BY子句之中

MySQL存储引擎介绍

佐手、 提交于 2019-11-29 02:14:19
目录 1. MySql体系结构 2. MySql存储引擎 2.1 InnoDB存储引擎 2.2 MyISAM存储引擎 2.3 Memory存储引擎 2.4 Archive存储引擎 3. 存储引擎对比整理 4. 参考 MySql数据库最大的特色就是其插件式的存储引擎架构,本文主要介绍MySql常用的存储引擎,为开发时选择合适的存储引擎提供参考。 1. MySql体系结构 在介绍存储引擎之前先来介绍下MySql的体系结构,以便大家知道存储引擎在MySql整个体系中处于什么位置。下图是官方提供的一张架构图: MySQL体系结构图 从上图可以发现,MySQL由以下几部分组成: 连接池组件 管理服务和工具组件 SQL接口组件 查询分析器组件 优化器组件 缓冲(Cache)组件 插件式存储引擎 物理文件 MySQL数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎,从上图中也可以看到,MySql支持很多种存储引擎。需要特别注意的是,存储引擎是基于表的,而不是数据库。 2. MySql存储引擎 插件式存储引擎的好处是:能够根据具体的应用的特点选择不同的存储引擎。下面是几种MySQL常用的存储引擎。 2.1 InnoDB存储引擎 InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计、支持外键,并支持类似于Oracle的非锁定读