mysql临时表

mysql_技能10_索引优化准备

旧城冷巷雨未停 提交于 2020-02-28 04:55:21
show [session|global] status 提供服务器状态信息。 show [session|global] status 可以根据需要加上参数“session”或者“global”来显示 session级(当前连接)的计结果和 global 级(自数据库上次启动至今)的统计结果。如果不写,默认使用参数是“session”。 下面的命令显示了当前 session 中所有统计参数的值: show status like ‘Com_______’; show status like ‘Innodb_rows_%’; 定位: 慢查询日志 : 通过慢查询日志定位那些执行效率较低的 SQL 语句,用–log-slow-queries[=filename]选项启动时,mysqld 写一个包含所有执行时间超过 longquery_time 秒的 SQL 语句的日志文件。具体可以查看本书第 26 章中日志管理的相关部分。 show processlist : 慢查询日志在查询结束以后才纪录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,可以实时地查看 SQL 的执行情况,同时对一些锁表操作进行优化。 explain分析执行计划: type性能由好到差的连接类型为

Mysql常规优化

回眸只為那壹抹淺笑 提交于 2020-02-27 08:58:58
一、SQL语句优化 (1)使用limit对查询结果的记录进行限定 (2)避免select *,将需要查找的字段列出来 (3)使用连接(join)来代替子查询 (4)拆分大的delete或insert语句 二、选择合适的数据类型 (1)使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob (2)使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数 (3)使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar (4)尽可能使用not null定义字段 (5)尽量少用text,非用不可最好分表 三、选择合适的索引列 (1)查询频繁的列,在where,group by,order by,on从句中出现的列 (2)where条件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出现的列 (3)长度小的列,索引字段越小越好,因为数据库的存储单位是页,一页中能存下的数据越多越好 (4)离散度大(不同的值多)的列,放在联合索引前面。查看离散度,通过统计不同的列值来实现,count越大,离散程度越高: mysql> SELECT COUNT(DISTINCT column_name) FROM table_name;

MySQL 架构与历史

和自甴很熟 提交于 2020-02-27 08:35:33
1、MySQL 逻辑架构,上层客户端-----》连接/线程处理------》解析器-----》优化器 -----》存储引擎,解析器如果有生成查询缓存,那么连接/线程处理也有可能直接到查询缓存,返回结果,图如下 2、并发控制,读写锁,共享锁,排他锁,锁粒度(表锁 table lock 行级锁 row lock) 3、事务 :原子性,一致性,隔离性,持久性 隔离级别:未提交度,提交读(不可重复读),可重复读 ,可串行化 死锁 MySQL 中的事务 4、多版本并发控制(MVCC),只在REPEATABLE READ 和 READ COMMIT下工作,原理就是每行记录后面加两个隐藏的列来实现,一个保存行的创建时间,一个保存行的过期时间;这个时间是指系统版本号; 4、MySQL存储引擎 InnoDB MyISAM archive(只支持isert和select操作,日志或者数据采集类) CSV fedetated引擎 Memory引擎(HEAP表)临时表局势memory引擎,场景 NDB集群引擎 第三方存储引擎(OLTP类引擎,XtrDB PBXT TokuDB) 面向列的存储引擎 infobright,大数据量 如何转换表引擎? 1、ALTER TABLE 慢,会消耗系统所有的I/O能力 2、导入与导出 3、创建与查询 create table innodb_table like

Limit参数优化MySQL查询的方法

主宰稳场 提交于 2020-02-27 08:35:09
在做一些查询时,总希望能避免数据库引擎做全表扫描,因为全表扫描时间长,而且其中大部分扫描对客户端而言是没有意义的。 那么,在 mysql 中有那些方式是可以避免全表扫面?除了通过使用索引列或分区等方式来进行查询的优化之外,还有那些呢? 看了一个老外写的程序,在 MySQL 查询中使用了很多 Limit 关键字,这就让我很感兴趣了,因为在我印象中, Limit 关键字似乎更多被使用 MySQL 数据库的程序员用来做查询分页(当然这也是一种很好的查询优化),那在这里举个例子,假设我们需要一个分页的查询 ,Oracle中一般来说都是用以下 SQL 句子实现: SELECT * FROM ( SELECT a1.*, rownum rownum_ FROM testtable a1 WHERE rownum > 20) WHERE rownum_ <= 1000 此语句能查询到 testtable 表中的 20 到 1000 记录,而且还需要嵌套查询,效率不会太高,看看 MySQL 的实现: SELECT * FROM testtable a1 limit 20,980; 这样就能返回 testtable 表中的 21 条到( 20 + 980 =) 1000 条的记录。 实现语法确实简单,但如果要说这里两个 SQL 语句的效率,那就很难做比较了,因为在 MySQL 中 Limit

Mysql存储过程

℡╲_俬逩灬. 提交于 2020-02-26 01:06:59
一、什么是mysql存储过程? 是在数据库系统中,一组为了完成特定功能SQL语句集,经编译后存储在数据库中,用户通过制定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 存储过程是经过编译的SQL语句集。编译后节省很多性能。 二、为什么使用存储过程? 1、存储过程只在创造时进行编译,以后每次执行存储过程都不需要再重新编译,而一般SQL语句每执行一次就编译一次,所以存储过程可以提高数据库执行速度 2、当对数据库进行复杂操作时(如对多个表进行UPDATE,INSERT,QUERY,DELETE时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用,这些操作如果用程序来完成,就变成一条条的SQL语句,可能要多次链接数据库,而换成存储过程,只需要链接一次数据库就可以了 3、存储过程可以重复使用,可以减少数据库开发人员的工作量 4、安全性高,可设定只有某些用户才具有对指定存储过程的使用权 三、存储过程的缺点 1、可移植性差 2、对于简单的SQL语句,存储过程没什么优势 3、存储过程中不一定会减少网络传输 4、如果一个用户使用数据库,那么存储过程对安全也没什么影响 5、团队开发时需要统一标准,否则后期维护起来麻烦 6、在大并发访问量的情况下,不宜写过多涉及运算的存储过程 7、业务逻辑复杂时,特别是涉及到对很大的表进行操作的时候,不如在前端先简化业务逻辑 四

sqoop从hdfs导出到mysql

蹲街弑〆低调 提交于 2020-02-23 13:43:53
create database logs; use logs create table weblogs_from_hdfs( md5 varchar(32), url varchar(64), request_date date, request_time time, ip varchar(15) ); sqoop export -m 1 --connect jdbc:mysql://hadoop:3306/logs --username root --password root --table weblogs_from_hdfs --export-dir /data/weblogs/import --input-fields-terminated-by '\t' 对于通过sqoop导入的数据为NULL的在导出到数据库中时依然保持为NULL.即使在文件中保存为字符串为'null'。 sqoop默认为insert 插入新的语句 --update-key 'md5' 则将创建更新语句,update ....where md5 = '.......' 如果--update-key 'md5' 设置的值没有找到,可以设置--update-mode allowinsert 允许新增这行数据 每个mapper默认默认插入1000条记录,然后提交事务,若mapper失败

MySQL 存储引擎 (二)

北城以北 提交于 2020-02-12 15:12:44
InnoDB存储引擎物理存储结构 ibdata1 : 系统数据字典信息(统计信息),UNDO表空间等数据 ib_logfile0 ~ ib_logfile1 : REDO日志文件,事务日志文件。 ibtmp1 : 临时表空间磁盘位置,存储临时表 frm : 存储表的列信息 ibd : 表的数据行和索引 共享表空间 需要将所有数据存储到同一个表空间中 ,管理比较混乱 5.5 版本出现的管理模式, 也是默认的管理模式。 5.6 版本, 共享表空间保留,只用来存储:数据字典信息,undo,临时表。 5.7 版本, 临时表被独立出来了 8.0 版本, undo也被独立出去了 select @@innodb_data_file_path; +-------------------------+ | @@innodb_data_file_path | +-------------------------+ | ibdata1:12M:autoextend | +-------------------------+ # 这里的目录是 my.cnf 中 datadir定义的目录 mysql> show variables like '%extend%'; +-----------------------------+-------+ | Variable_name | Value | +-----

MySQL最大连接数设置

感情迁移 提交于 2020-02-09 04:28:08
“Can not connect to MySQL server. Too many connections”-mysql 1040错误, 这是因为访问MySQL且还未释放的连接数目已经达到MySQL的上限。通常,mysql的最大连接数默认是100, 最大可以达到16384 第一种:命令行修改。 mysql>mysql -uuser -ppassword(命令行登录MySQL) mysql>show variables like 'max_connections';(查可以看当前的最大连接数) msyql>set global max_connections=1000;(设置最大连接数为1000,可以再次查看是否设置成功) mysql>exit(推出) 这种方式有个问题,就是设置的最大连接数只在mysql当前服务进程有效,一旦mysql重启,又会恢复到初始状态。 因为mysql启动后的初始化工作是从其配置文件中读取数据的,而这种方式没有对其配置文件做更改 第二种:修改配置文件。 这种方式说来很简单,只要修改MySQL配置文件my.ini 或 my.cnf的参数max_connections,  将其改为max_connections=1000,然后重启MySQL即可。但是有一点最难的就是my.ini这个文件在哪找。 通常有两种可能,一个是在安装目录下(这是比较理想的情况)

MySQL-死锁查询

大城市里の小女人 提交于 2020-01-30 23:20:31
1、查询是否锁表 show OPEN TABLES where In_use > 0; 查询到相对应的进程 === 然后 kill id 2、查询进程 show processlist 补充: 查看正在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 查看等待锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 1 show processlist; SHOW PROCESSLIST显示哪些线程正在运行。您也可以使用mysqladmin processlist语句得到此信息。如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程(也就是,与您正在使用的MySQL账户相关的线程)。如果有线程在update或者insert 某个表,此时进程的status为updating 或者 sending data。 如果您得到“too many connections”错误信息,并且想要了解正在发生的情况,本语句是非常有用的。MySQL保留一个额外的连接,让拥有SUPER权限的账户使用,以确保管理员能够随时连接和检查系统(假设您没有把此权限给予所有的用户)。 Status 含义 Checking table 正在检查数据表(这是自动的)。 Closing

MySQL优化

烂漫一生 提交于 2020-01-29 15:58:54
一、SQL语句优化 (1)使用limit对查询结果的记录进行限定 (2)避免select *,将需要查找的字段列出来 (3)使用连接(join)来代替子查询 (4)拆分大的delete或insert语句 二、选择合适的数据类型 (1)使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob (2)使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数 (3)使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar (4)尽可能使用not null定义字段 (5)尽量少用text,非用不可最好分表 三、选择合适的索引列 (1)查询频繁的列,在where,group by,order by,on从句中出现的列 (2)where条件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出现的列 (3)长度小的列,索引字段越小越好,因为数据库的存储单位是页,一页中能存下的数据越多越好 (4)离散度大(不同的值多)的列,放在联合索引前面。查看离散度,通过统计不同的列值来实现,count越大,离散程度越高: mysql> SELECT COUNT(DISTINCT column_name) FROM table_name;