mysql执行计划

MySQL 慢查询优化

喜欢而已 提交于 2019-12-19 07:52:17
为什么查询速度会慢    1.慢是指一个查询的响应时间长。一个查询的过程: 客户端发送一条查询给服务器 服务器端先检查查询缓存,如果命中了缓存,则立可返回存储在缓存中的结果。否则进入下一个阶段 服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。 MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询。 将结果返回给客户端    2.数据访问 是否向数据库请求了不需要的数据 是否扫描额外的记录    3.查询的方式 一个复杂的查询还是多个简单的查询 切分查询(将大查询切分成小查询,循环完成小查询) 分解关联查询 慢查询分析   问题SQL     把复杂的SQL分成多个简单SQL并执行,查看具体那个字段会慢,区分度不高。   EXPLAIN     显示SQL如何使用索引的执行计划。     执行计划的参数: table 显示这一行的数据是关于哪张表的 type 显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL possible_keys 显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句 key 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE

mysql存储过程详解

限于喜欢 提交于 2019-12-19 05:43:22
mysql存储过程详解 1. 存储过程简介   我们常用的操作数据库语言 SQL 语句在执行的时候需要要先编译,然后执行,而存储过程( Stored Procedure )是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。   一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有 SQL 语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 存储过程通常有以下优点: (1). 存储过程增强了 SQL 语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2). 存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的 SQL 语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3). 存储过程能实现较快的执行速度。如果某一操作包含大量的 Transaction-SQL 代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化

mysql 查询优化杂谈

醉酒当歌 提交于 2019-12-19 05:25:32
  在数据库中,对性能影响最大的包括数据库的锁策略、缓存策略、索引策略、存储策略、执行计划优化策略。 索引策略决定数据库快速定位数据的效率,存储策略决定数据持久化的效率。 一。索引注意事项 1.索引不存储null值。 更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引,只能全表扫描。 为什么索引列不能存Null值? 因为将索引列值进行建树,其中必然涉及到诸多的比较操作。 2.不适合键值较少的列(重复数据较多的列)。 假如索引列TYPE有5个键值,如果有1万条数据,那么 WHERE TYPE = 1将访问表中的2000个数据块。 再加上访问索引块,一共要访问大于2000个的数据块。 如果全表扫描,假设10条数据一个数据块,那么只需访问1000个数据块,既然全表扫描访问的数据块 少一些,肯定就不会利用索引了。 3.前导模糊查询不能利用索引(like '%XX'或者like '%XX%') 假如有这样一列code的值为'AAA','AAB','BAA','BAB' ,如果where code like '%AB'条件,由于前面是 模糊的,所以不能利用索引的顺序,必须一个个去找,看是否满足条件。这样会导致全索引扫描或者全表扫 描。如果是这样的条件where code

MySQL索引

别来无恙 提交于 2019-12-18 20:49:04
为什么MySQL性能优化必问索引 正确的创建合适的索引是数据库优化的 基础 。 索引的本质和工作机制 索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。 在RDBMS系统(关系数据库管理系统)中数据的索引都是 硬盘级 索引。 工作机制 以id为例,通过将id与id所代表的数据所在磁盘地址进行绑定,以达到加快查询性能的目的。 MySQL选择B+Tree的推演过程 传统的二叉搜索树 相比较二叉树,二叉搜索树需要满足一个性质,即当y是x的左子树的一个节点(注:不是直接子节点,是左子树的所有节点),则y.key <= x.key;如果y是x右子树的一个节点,则y.key >= x.key。 极端的二叉搜索树 这同样是一颗二叉搜索树,因为它满足二叉搜索树所需要的性质,同时这也是我们经常会遇到的二叉搜索树。 假如我们的id字段做了个自增操作,所以我们第一个插入的id就会作为根节点,后面插入的也会基于根节点来进行比对,但因为id是自增,则不会存在左子树。最终形成了一个线性链表。假如我们的运气很差,我们需要查询的是最后一个节点,那最终就变成了全表扫描。 平衡二叉搜索树(AVL树) 平衡二叉搜索树相较于二叉搜索树多了平衡二字,那么它平衡在哪呢? 左子树与右子树高度之差的绝对值不超过1 树的每个左子树和右子树都是AVL树 每一个节点都有一个平衡因子(balance factor)

MySQL存储过程

允我心安 提交于 2019-12-18 20:15:51
存储过程简介 SQL语句需要先编译在执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经过编译后存储在数据库中,用户通过制定存储过程的名字以及参数(如果有入口参数的话)来执行它. 存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。 存储过程的优点: (1). 增强SQL语言的功能和灵活性 :存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2). 标准组件式编程 :存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3). 较快的执行速度 :如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。 (4). 减少网络流量: 针对同一个数据库对象的操作

mysql explain执行计划详解

穿精又带淫゛_ 提交于 2019-12-18 20:06:21
1)、id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询。 2)、select_type列常见的有: A:simple:表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple,且只有一个 B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个 C:union:union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union D:dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响 E:union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null F:subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery G:dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响 H:derived:from字句中出现的子查询,也叫做派生表

MySQL_执行计划详细说明

情到浓时终转凉″ 提交于 2019-12-18 04:37:19
1 简要说明 id 表格查询的顺序编号。 降序查看,id相同的从上到下查查看。 id可以为null ,当table为( union ,m,n )类型的时候,id为null,这个时候,id的顺序为 m跟n的后面。 select_type 查询的方式 下文详细说明。 table 表格名称 表名,别名,( union m,n )。 partitions 分区名称 查询使用到表分区的分区名。 type 表连接的类型 下文详细说明。 possible_keys 可能使用到的索引 这里的索引只是可能会有到,实际不一定会用到。 key 使用到的索引 实际使用的索引。 key_len 使用到索引的长度 比如多列索引,只用到最左的一列,那么使用到索引的长度则为该列的长度,故该值不一定等于 key 列索引的长度。 ref 谓词的关联信息 当 join type 为 const、eq_ref 或者 ref 时,谓词的关联信息。 可能为 :null(非 const \ eq_ref \ ref join type 时)、const(常量)、关联的谓词列名。 rows 扫描的行数 该表格扫描到的行数。这里注意在mysql里边是嵌套链接,所以,需要把所有rows相乘就会得到查询数据行关联的次数 filtered 实际显示行数占扫描rows的比例 实际显示的行数 = rows * filtered / 100

MySQL体系结构及多实例

邮差的信 提交于 2019-12-18 01:25:05
MySQL客户端和服务器端模型 MySQL是一个典型C/S,服务器端与客户端两部分组成 服务器端程序 mysqld mysql自带的客户端(mysql mysqladmin mysqldump等),API接口(php-mysql) 连接方式 通过网络连接串,TCP/IP:(用户名;密码;IP;port) mysql -uroot -p123 -h 10.0.0.52 -P 3306 通过套接字文件,SOCKET:(用户名;密码;Socket路径) mysql -uroot -p123 -S /application/mysql/tmp/mysql.sock MySQL服务器构成(实例的构成) 实例 MySQL在启动过程 启动后台守护进程(mysqld),并生成工作线程(xxxx) 预分配内存结构供MySQL处理数据使用 线程是干活的,进程是分配线程的 MySQL启动过程中,启动了一个守护进程(mysqld),并生成了许多线程 实例是什么: MySQL的后台进程+线程+预分配的内存结构 mysqld服务的构成 分为三层: 连接层 SQL层 存储引擎层 连接层 通信协议(tcp/ip socket) 连接线程 用户验证(合法性,让不让连接) SQL层 sql层的处理流程图解: SQL:结构化的查询语言(数据库内部的逻辑语言)又分为: DDL:数据库定义语言 DCL:数据库控制语言

MySQL基础知识

霸气de小男生 提交于 2019-12-17 18:09:55
一、MySQL安装 MySQL的下载 http://dev.mysql.com/downloads/mysql/ MySQL版本选择 MySQL功能自定义选择安装 1.功能自定义选择 2.路径自定义选择 3.设置root用户密码 4.安装完成,点击MySQL Workbench 6.3 CE进入MySQL客户端 二、SQL基础 SQL语句分类 1.DDL(Data Definition Languages)语句: 数据定义语言 ,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包括create/drop/alter 2.DML(Data Manipulation Language)语句: 数据操纵语句 ,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用的语句关键字主要包括 insert/delete/update/select等 3.DCL(Data Control Language)语句: 数据控制语句 ,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant/revoke等 DDL语句(涉及表的定义、结构的修改) 一、create语句 Query Ok代表语句执行成功 1 row affected代表数据库一行收到影响 0.01 sec代表操作执行的时间

Mysql优化的思路方法详解

依然范特西╮ 提交于 2019-12-17 11:54:18
一、分析Mysql慢的原因 1、CPU计算复杂,语句问题 2、频繁的I/O 二、准确定位 1、检查慢查询 (1)先可以查看日志和慢查询 查看所有日志状态: show variables like '%quer%'; 查看慢查询状态:show variables like 'show%' (2)如何发现有问题的sql long_Qury_time 注意:查看是否开启慢查询 eg:show variables like '%long_Qury_time%' 开启 set glaobal slow_Qury_log=1 默认慢查询是10秒,如果修改之后需要重新打开一个新的对话 (3)explain返回各列的含义 3.1 MySql内部函数explain(查询sql的执行计划) 使用方法以及返回各列的含义explain返回各列的含义 table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index 和ALL possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。 key:实际使用的索引。如果为NULL,则没有使用索引。 keyjen:使用的索引的长度。在不损失精确性的情况下,长度越短越好ref:显示索引的哪一列被使用了,如果可能的话,是一个常数 rows