mysql执行计划

Mysql存储过程

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

MySQL性能优化学习(一)—— MySQL的执行流程

佐手、 提交于 2020-01-17 05:09:02
一、一条sql的执行过程 APP(客户端) ↓↓ 查询缓存 可以提高效率,但sql不完全一样时即失效。表内容变化时也失效。因此最好还是ORM框架去实现。 MYSQL的查询缓存默认关闭,8.0的版本以后已经去除该缓存模块。 ↓↓ 解析器 对sql进行词法解析,语法解析。判断是否正确 ↓↓ 预处理器 检查表是否存在,列是否存在 ↓↓ 查询优化器 执行前对sql进行优化,生成执行计划 查询优化器追踪: ↓↓ 查询执行引擎 由其获得执行计划去操作存储引擎 ↓↓ 存储引擎 数据存放在什么结构里,由存储引擎决定。 每个表都可以有不同的存储引擎。 查看表的存储引擎: show table status from `tablename`; 执行流程整体图: 二、存储引擎 5.5版本以前默认MyISAM,之后默认InnoDB MyISAM只支持表级别的锁,插入和查询的操作效率高,不支持事物,不支持外键。 InnoDB支持事物和外键,支持行锁,因此数据完整性较高。数据一致性要求高,比较多更新操作适用, Memory数据存放在内存中,读写数据快,如果需要临时存储数据适用。 CSV表体积较小,适用于迁移,不支持索引。 InnoDB的结构 BufferPoor:写入磁盘前先走BP,提升读写效率 RedoLog:先写日志,再把数据从内存同步到磁盘中 仅在InnoDB中实现,可用于崩溃恢复 UndoLog

sq:mysql:存储过程

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

12 个Mysql查询技巧!

一世执手 提交于 2020-01-16 13:33:04
应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。 那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们也有莫大的关系。 程序中嵌入的一行行的SQL语句,如果使用了一些优化小技巧,定能达到事半功倍的效果。 技巧一:比较运算符能用“=”就不用“<>” “=”增加了索引的使用几率。 技巧二:明知只有一条查询结果,那请使用“LIMT 1” ”LIMT 1“可以避免全表扫描,找到对应结果就不会再继续扫描了。 技巧三:为列选择合适的数据类型 能用TINYINT就不用SMALLINT,能用SMALLINT就不用INT,磁盘和内存消耗的越小越好。 技巧四:将大的DELETE UPDATE OR INSERT 查询变成多个小查询 技巧五:使用UNION ALL 代替UNION,如果结果集允许重复的话。 因为UNION ALL不去重,效率高于UNION。 技巧六:为获取相同结果集的多次执行,请保持sql语句前后一致。 为了充分利用查询缓存。 * 技巧七:尽量避免使用“SELECT ” 其不能有效利用索引,增大了数据库服务器的负担,以及它与应用程序客户端之间网络IO开销。 技巧八:WHERE子句里面的列尽量被索引 索引太多也会降低性能。 技巧九:JOIN子句里面的列尽量被索引 技巧十:ORDER

MySQL 8.0发布,你熟悉又陌生的Hash Join?

大城市里の小女人 提交于 2020-01-16 00:55:45
昨天下午在查资料的时候,无意间点到了MySQL的官网。发现MySQL发布了一个新版本。 Mysql这个数据库有没有人不熟悉?不用的?没有吧。 2019年末,MySQL发布的8.0.18 GA版本,带来了一些新特性和增强功能。其中最引人注目的莫过于多表连接查询 支持Hash Join 。 还是老样子,建议英文好的同学直接看这里: https://dev.mysql.com/doc/refman/8.0/en/hash-joins.html 关于MySQL Hash Join的特性介绍: 1、对于大数据量的表关联,HJ(Hash Join)速度将明显比NL(Nested Loop)快很多 2、在内存中处理 3、必要情况下,会使用磁盘空间 4、用于内连接,可扩展到外连接、半连接和反连接 5、替换查询计划中的Block Nested Loop 6、可以通过HINT强制SQL走HJ或者NL 有的同学可能已经懵逼了。什么是Hash Join?什么是NL?HINT又是什么鬼? 第一部分先做一个简单的科普 首先,在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式。多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join。 肯定有人说,阿里巴巴规范上都说了,并发情况下不能用多表查询。你有多大并发

MySQL数据库索引详解

蓝咒 提交于 2020-01-15 13:04:20
一、什么是索引:   索引是一个排序的列表,在这个列表中存储着索引值和包含这个值的数据所在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询速度,这是因为使用索引后可以不用全表扫描来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。   索引通过不断缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机事件变成顺序事件,也就是说,有个这个机制我们可以总是用同一种查找方式来锁定数据;   索引实际就是一张表,该表保存了主键和索引字段,并指向实体表的记录,所以索引也是占了一大部分空间,不可能存储在内存中,因此索引往往都是以文件形式存储在我们的硬盘上。 二、索引的分类: 常见索引有主键索引、唯一索引、普通索引、全文索引和组合索引。 1、主键索引 主索引,根据pk_clolum(length)建立索引,不允许重复,不允许空值; ALTER TABLE 'table_name' ADD PRIMARY KEY pk_index('col'); 2、唯一索引 用来建立索引的列的值必须是唯一的,允许空值; ALTER TABLE ‘table_name' ADD UNIQUE index_name('col'); 3、普通索引 用表中的普通列构建的索引,没有任何限制; ALTER TABLE 'table_name' ADD INDEX index_name(

MySQL的存储原理和过程

五迷三道 提交于 2020-01-15 09:03:25
Mysql储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之就是一组已经写好的命令,需要使用的时候拿出来用就可以了。想要快速的了解Mysql储存过程吗,就一同看一下下文的“Mysql储存过程-原理、语法、函数详细说明”吧! 一、Mysql储存过程简介: 储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。存储过程通常有以下优点: 1)存储过程能实现较快的执行速度。 如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。 心得:编译优化,快! 2)存储过程允许标准组件是编程。 存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句

mysql性能优化学习笔记(2)如何发现有问题的sql

时光总嘲笑我的痴心妄想 提交于 2020-01-15 04:47:06
一、使用mysql慢查询日志对有效率问题的sql进行监控 1)开启慢查询 show variables like ‘slow_query_log’;//查看是否开启慢查询日志 set global slow_query_log_file=‘/mysql/‘; //设置慢查询日志的位置 set global log_queries_not_using_indexes=on;//设置没有使用索引的sql语句 set global long_query_time=1;//设置超过1秒的sql语句进行记录。 注意:这里设置了long_query_time后,会发现设置不成功,可能是一个bug,需要重新开启一个终端,再查询一下设置,会发现生效了。 2)查看慢查询日志的格式 # Time: 151115 6:35:08 # User@Host: root[root] @ localhost [] # Query_time: 0.007896 Lock_time: 0.006150 Rows_sent: 200 Rows_examined: 200 SET timestamp=1447540508; select * from actor; 3)工具一:mysqldumpslow mysqldumpslow -t 3 /var/lib/mysql/localhost-centos6-slow

MySQL执行计划

不羁的心 提交于 2020-01-15 02:59:35
这两天看了一下sql explain,似乎工作中我们不太重用这个命令。(但是某些场合又很重要,例如面试)。 之所以突然想起来拿出来说说,就是前两天产品经理跑过来跟我讲了一个需求:把某个客户这一年的库存出入库报表导出来。 我们wms系统是支持报表查询及导出功能的,但是仅支持三个月的查询,所以系统无法满足此项需求。 看一下sql: select wh.name '仓库名称',customer.name'所属货主',sku.sku_name '商品名称',sku.sku_code '商品编码',unit.name '单位', temp.startNum '期初库存',temp.addNum '入库',temp.subNum '出库',temp.endNum '结存', temp.reportTime '统计日期' from (SELECT id , store_id storeId , customer_id customerId , sku_id skuId, SUM(add_num) addNum, SUM(`sub_num`) subNum, SUBSTRING_INDEX(GROUP_CONCAT( start_num ORDER BY report_time ), ',',1) startNum, SUBSTRING_INDEX(GROUP_CONCAT( end_num

MySQL存储过程和存储函数

試著忘記壹切 提交于 2020-01-14 09:00:16
关于存储过程学习自 :http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言 SQL 语句在执行的时候需要要先编译,然后执行,而 存储过程( Stored Procedure )是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它 。 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有 SQL 语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 存储过程通常有以下优点: (1). 存储过程增强了 SQL 语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2). 存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的 SQL 语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3). 存储过程能实现较快的执行速度。如果某一操作包含大量的 Transaction-SQL 代码或分别被多次执行