mysql执行计划

谈谈MySQL隐式类型转换

怎甘沉沦 提交于 2019-12-06 20:58:11
本文首发于个人微信公众号《andyqian》,期待您的关注! 前言 今天我们继续回到MySQL系列文章中,谈一谈MySQL中隐式类型转换。(其实我最早知道是在慢SQL优化中知道隐式类型转换概念的),在说隐式类型转换之前,首先我们通过一个实例来看看是怎么回事。 数据结构 本文中所有的操作,都是基于该数据结构(有兴趣的童鞋,可以实验): create table t_base_user( oid bigint( 20 ) not null primary key auto_increment, name varchar( 30 ) null comment "name" , email varchar( 30 ) null comment "email" , age int null comment "age" , telephone varchar( 30 ) null comment "telephone" , status tinyint( 4 ) null comment "0 无效 1 有效 " , created_at datetime null default now() comment " 创建时间 " , updated_at datetime null default now() comment " 修改时间 " ) ### 新建索引 alter table t

也议MySQL中隐式转换

China☆狼群 提交于 2019-12-06 20:52:37
1. 环境说明 blog地址: http://blog.csdn.net/hw_libo/article/details/39252427 RHEL 6.4 x86_64 + MySQL 5.6.19 测试表: MySQL [test]> show create table emp\G *************************** 1. row *************************** Table: emp Create Table: CREATE TABLE `emp` ( `EMPNO` int(11) NOT NULL, `ENAME` varchar(15) NOT NULL, `JOB` varchar(15) NOT NULL, `MGR` int(11) DEFAULT '0', `HIREDATE` timestamp NULL DEFAULT NULL, `SAL` int(20) DEFAULT '0', `COMM` int(11) DEFAULT '0', `DEPTNO` int(11) NOT NULL, PRIMARY KEY (`EMPNO`), KEY `idx_deptno` (`DEPTNO`), KEY `idx_sal` (`SAL`), KEY `idx_comm` (`COMM`), KEY `idx_ename

mysql日志、数据备份与恢复

江枫思渺然 提交于 2019-12-06 15:17:34
Mysql体系结构 MySQL属于Client/Server结构,Server端程序为mysqld,该服务启动后,Client端程序从本地或者远程连接Server 常见的Client程序,例如:mysql、mysqldump、mysqlshow、mysqlbinlog等,也包括通过MySQL API和连接器连接到MySQLD的各类编程语言程序 mysqld程序为服务器进程可以划分为下面三个层 连接层:处理连接 SQL 层:处理所连接的应用程序发送的 SQL 查询 存储层:处理数据存储,MySQL数据可以按不同格式和结构存储在不同物理介质上,也称为存储引擎 mysql连接层 通过多种通信方式接受来自客户机的连接请求 包括如下协议 | 方式 | 连接类型 | 支持的操作系统 | | -------------- | ---------- | -------------- | | TCP/IP | 本地、远程 | 所有 | | UNIX套接字文件 | 仅本地 | UNIX | | 共享内存 | 仅本地 | Windows | | 命名管道 | 仅本地 | Windows | sql层 建立连接后,MySQL 服务器将处理以下任务: 授权和解析器:解析器验证语法是否正确,然后,授权验证是否允许所连接的用户运行特定查询 (已验证通过的用户是否具有访问数据库对象的权限) 优化器

ProxySQL--灵活强大的MySQL代理层

你。 提交于 2019-12-06 14:40:19
本文是我在学习和验证ProxySQL的过程中,从初识(对其机制猜想或凭几次命令的结果臆断其原理),到逐渐深入(模拟各种场景测试、抓包分析、与作者交流)过程中的 思路 和 方法 和 结论 的记录。 笔者初识proxysql的时候是1.2.1版本,现在几经演进,已经到了1.4.1版本,本文也几经修改,力求跟得上软件的最新进度。 ProxySQL项目网址 一、亮点 几乎所有的配置均可在线更改(其配置数据基于SQLite存储),无需重启proxysql 基于正则和client_addr的强大和灵活的路由规则 详细的状态统计,统计结果和pt-query-digest对慢日志的分析结果类似,相当于有了统一的查看sql性能和sql语句统计的入口(Designed by a DBA for DBAs) 自动重连和重新执行机制(auto-reconnect and automatic re-execution of queries using it's Connections Pool ):若一个请求在链接或执行过程中意外中断,proxysql会根据其内部机制重新执行该操作 query cache功能:比mysql自带QC更灵活,可在 mysql_query_rules 表中依据 digest , match_pattern , client_addr 等维度控制哪类语句可以缓存 支持连接池

mysql之explain

余生长醉 提交于 2019-12-06 14:19:19
使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。 注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中。 type列 这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。 依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL 一般来说,得保证查询达到range级别,最好达到ref key列 这一列显示mysql实际采用哪个索引来优化对该表的访问。 如果没有使用索引,则该列是 NULL key_len列 这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了联合索引中的哪些 列。 key_len计算规则如下: 字符串 char(n):n字节长度 varchar(n):可变数据类型.最大n个字符。n字节长度,2字节存储字符串长度,如果是utf-8,则长度 3n + 2 数值类型 tinyint:1字节 smallint:2字节 int:4字节 bigint:8字节  时间类型 date:3字节 timestamp:4字节 datetime:8字节

关于mysql中的锁总结

谁说我不能喝 提交于 2019-12-06 14:00:56
一、锁的基本信息: 共享锁(s):又称读锁。允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。 排他锁(X):又称写锁。允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。 大家通常以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句:update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select …for update语句,加共享锁可以使用select … lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select …from…查询数据,因为普通查询没有任何锁机制。 意向共享锁(IS)

高性能Mysql

怎甘沉沦 提交于 2019-12-06 10:06:59
写于2018-04-26 索引及数据库高性能基础 作为最核心的内功知识,也是面试中我对应聘者的重点考察项之一。迄今为止,在这方面能让我完全满意的应聘者寥寥无几。 注意: 这里介绍的技能对Mysql、SqlServer、Oracle等关系型数据库基本通用,比较而言,Mysql索引机制更加简单,为了排除更高级的数据库特性带来的复杂性,本文采用Mysql作为性能分析案例。 另外 Mysql常见的存储引擎:MyISAM、InnoDB,实际项目中极少采用MyISAM,大多采用InnoDB。 InnoDB的索引类型:BTREE、HASH,实际项目中很少使用HASH索引,基本都采用BTREE 故采用InnoDB和BTREE作为案例分析更具有普遍性。以下介绍的基础知识可能随着Mysql的版本发展会有少许变化。 I 关于索引 数据准备 建测试表: CREATE TABLE `user_info` ( `user_id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `age` int(18) NOT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=10000001 DEFAULT CHARSET=utf8 生成测试数据: public

mysql 监控及优化——转载自http://www.cnblogs.com/suansuan/

自作多情 提交于 2019-12-06 09:59:05
1、Mysql连接数   Mysql默认最大连接数为100。   设置Mysql的最大连接数,在Mysql的配置文件中增加:   max_connections = 1000               #Mysql的最大连接数,默认如果不写的话是100个   wait_timeout = 10               #超时时间   配置文件路径:    (/etc/my.cnf 系统自带) (/opt/lampp/etc/my.cnf 安装Mysql 路径)   查看当前有多少个连接   show status like '%Threads_connected%';  #查看当前连接数   show processlist;            #也可查看锁表 2、Mysql缓存   Query Cache缓存的是sql语句对应的结果集,InnoDB_Buffer_Pool中缓存的是表中的数据。Buffer_Pool是设置的越大越好,一般设置为服务器物理内存的70%。   缓存1(MySQL层):查询缓存 Query Cache     ①.查询表里的数据有变化,之前的缓存失效。     ②.查询语句必须一模一样,才能用查询缓存;只要字符大小写或者注释等有一点点不同,都不可以用查询缓存。     ③.任何一个包含不确定的函数(比如now(),current_date()

常用mysql命令大全

孤街醉人 提交于 2019-12-06 08:03:33
常用的MySQL命令大全 连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1、例1:连接到本机上的MYSQL。 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>。 2、例2:连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令: mysql -h110.110.110.110 -uroot -pabcd123 (注:u与root可以不用加空格,其它也一样) 3、退出MYSQL命令: exit (回车)。 修改密码 格式:mysqladmin -u用户名 -p旧密码 password 新密码 1、例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令: mysqladmin -uroot -password ab12 注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。 2、例2:再将root的密码改为djg345。 mysqladmin -uroot -pab12 password djg345 增加新用户。(注意:和上面不同

MySQL8.0 新特性 Hash Join

女生的网名这么多〃 提交于 2019-12-06 04:29:20
概述&背景 MySQL一直被人诟病没有实现HashJoin,最新发布的8.0.18已经带上了这个功能,令人欣喜。有时候在想,MySQL为什么一直不支持HashJoin呢?我想可能是因为MySQL多用于简单的OLTP场景,并且在互联网应用居多,需求没那么紧急。另一方面可能是因为以前完全靠社区,这种演进速度毕竟有限,Oracle收购MySQL后,MySQL的发版演进速度明显加快了很多。 HashJoin本身算法实现并不复杂,要说复杂,可能是优化器配套选择执行计划时,是否选择HashJoin,选择外表,内表可能更复杂一点。不管怎样现在已经有了HashJoin,优化器在选择Join算法时又多了一个选择。MySQL本着实用主义,相信这个功能增强也回应了一些质疑,有些功能不是没有能力做好,而是有它的优先级。 在8.0.18之前,MySQL只支持NestLoopJoin算法,最简单的就是Simple NestLoop Join,MySQL针对这个算法做了若干优化,实现了Block NestLoop Join,Index NestLoop Join和Batched Key Access等,有了这些优化,在一定程度上能缓解对HashJoin的迫切程度。下文会单独拿一个章节讲MySQL的这些Join优化,下面先讲HashJoin。 Hash Join算法 NestLoopJoin算法简单来说