精华内容
下载资源
问答
  • mysql 中 sql 查询语句执行过程 (mysql基本架构)
    万次阅读
    2022-01-13 20:40:34

    image-20220113195223572

    mysql总体上分为server层和存储引擎层

    server层负包括连接器、缓存、解析器、优化器、执行器

    存储引擎层则负责存储数据

    连接器

    连接器负责跟客户端建立连接、获取权限、维持和管理连接。

    它首先会判断请求的账号和密码是否正确,如果不正确则返回 ”Access denied for user”的错误,当账户验证成功后,连接器会去权限表中查询该用户的权限,该连接随后所有操作的权限都与此次查询的权限有关(即使修改了用户的权限,这条连接的权限还是获取时的权限,只有下次建立新的连接才会修改)

    通过 show processlist 可以查看当前的连接以及其状态,当连接超过 8 小时没有进行任何的操作就会断开连接,时长可以通过 wait_timeout 控制

    一个连接的连接时间过长可能会导致 mysql 发生 OOM,因为一个连接所占用的内存只有在断开时被清理,所以我们可以通过以下方法解决

    • 定期断开连接,直到下次需要进行操作时再重新创建连接
    • mysql5.7 之后的版本可以运行 mysql_reset_connection 来将所有连接恢复到初始的状态

    缓存

    当一条查询请求到达后,会先到查询缓存中查找是否存在缓存,缓存以 key-value 的形式存储,key 为 sql 语句,value 为查询结果

    通常不建议使用查询缓存,因为其弊大于利:

    查询缓存的失效非常的频繁,一张表的缓存会在这张表更新时全部删除,这就可能导致了一个缓存还没有被使用就被删除了,这样频繁更新的表的缓存命中率就会很低

    在 mysql8.0 后查询缓存的模块就被删除了

    ​ 解析器

    如果缓存没有命中就会进入解析器,解析器会对 sql 语句进行 “词法分析” 和 “语法分析”

    词法分析会将 sql 语句中每个单词的含义分析出来,如:select 代表查询关键字、T 对应数据库中一张表

    语法分析则会判断这条 sql 语句是否满足语法要求

    优化器

    如果解析器判断 sql 语句没有问题就会进入优化器,优化器顾名思义就是对 sql 语句进行优化

    mysql> select * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;
    

    上述语句有两种方案:

    • 先找到 t1 中 c=10 的数据,之后根据 id 进行联合,再找到 t2 中 d=20 的数据

    • 先找到 t2 中 d=20 的数据,之后根据 id 进行联合,再找到 t1 中 c=10 的数据

    这两种方案的执行效果相同,但是最终的执行时间不一定相同,优化器的作用就是找到执行的方案和选择索引

    经过优化器后 sql 的执行方案就被确定下来了

    执行器

    执行器会根据前面的结果执行语句

    执行前会进行权限的判断是否有对该表的权限,如果没有就会报错

    如果有权限就会根据执行方案和选择的索引执行相应的语句,不同的表有不同的引擎,这里会调用相应引擎的接口去执行

    更多相关内容
  • MySQL下,在启动参数中设置 –log-slow-queries=[文件名],就可以在指定的日志文件中记录执行时间超过long_query_time(缺省为10秒)的SQL语句。你也可以在启动配置文件中修改long query的时间,如: 代码如下: ...
  • Mysql中如何查看Sql语句执行效率

    Mysql中如何查看Sql语句的执行时间

    一、初始SQL准备

    • 初始化表
    -- 用户表
    create table t_users(
                            id int primary key auto_increment,
    -- 用户名
                            username varchar(20),
    -- 密码
                            password varchar(20),
    -- 真实姓名
                            real_name varchar(50),
    -- 性别 1表示男  0表示女
                            sex int,
    -- 出生年月日
                            birth date,
    -- 手机号
                            mobile varchar(11),
    -- 上传后的头像路径
                            head_pic varchar(200)
    );
    
    • 初始化数据
    --添加用户数据
    insert into t_users values(null,'whj','123456','王恒杰',1,NOW(),'12345678901','boy.jpg');
    insert into t_users values(null,'dzw','123456','邓正武',1,NOW(),'12345678901','boy.jpg');
    insert into t_users values(null,'yfj','123456','杨福君',1,NOW(),'12345678901','girl.jpg');
    insert into t_users values(null,'zx','123456','张西',1,NOW(),'12345678901','girl.jpg');
    insert into t_users values(null,'zxj','123456','周宣君',0,NOW(),'12345678901','boy.jpg');
    insert into t_users values(null,'lfk','123456','刘福昆',1,NOW(),'12345678901','boy.jpg');
    
    • 表结构
      在这里插入图片描述

    • 相关数据

    在这里插入图片描述

    二、Mysql查看Sql语句的执行时间

    1、show profiles;

    最开始输入show profiles.此时没有数据

    在这里插入图片描述

    2、show variables;

    • show varables:查看profiling是否开启,即Value为ON

    在这里插入图片描述

    直接使用show variables命令会将所有变量展示出来,太多了,我们不方便查看

    就可以使用模糊查询了,用like将profiling挑选出来

    一般没有开启都为off

     show variables like 'profiling';
    

    在这里插入图片描述

    3、set profilling=1,开启profiling

    show variables like 'profiling';
    

    在这里插入图片描述

    这样我们的Mysql就可以查看Sql语句的执行时间

    三、不同查询的执行时间

    select * from t_users;     
    select id,username,password,real_name,sex,birth,mobile,head_pic from t_users;
     
    select * from t_users where username like 'whj';
    

    在这里插入图片描述

    • 三种查询的时间对比

    在这里插入图片描述

    结论:

    sql 在使用SELECT语句或者使用其它语句时,直接使用*和把所有的字段弄上去查询,性能有很大差距,所以我们平时写查询最好用字段写上

    展开全文
  • 2.MySQL查询语句如何执行

    万次阅读 2021-08-16 17:35:07
    Server层:大多数MySQL的核心服务功能都在这一层,包括连接处理、授权认证、查询解析、分析、优化、缓存以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能都在这一层实现,比如存储...

    MySQL分为Server层和存储引擎层两个部分,不同的存储引擎共用一个Server层。

    在这里插入图片描述

    Server层:大多数MySQL的核心服务功能都在这一层,包括连接处理、授权认证、查询解析、分析、优化、缓存以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

    存储引擎层:存储引擎负责MySQL中数据的存储和提取。服务器通过API与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。

    MySQL客户端与服务端的通信方式是“半双工”,客户端一旦开始发送消息另一端要接收完整这个消息才能响应,客户端一旦开始接收数据就没法停下来发送指令,一请求一响应。

    连接器

    第一步,先连接到数据库上,当客户端(应用)连接到MySQL服务器时,服务器需要对其进行认证,认证基于用户名、原始主机信息和密码,一旦客户端连接成功,服务器会继续验证客户端是否具有执行某个特定查询的权限(例如,是否允许客户端对某一数据库的某一表执行SELECT语句)

    连接命令:

    mysql -h$ip -p$port -u$user -p
    

    输完命令之后,需要在交互对话里面输入密码,密码不建议在-p后面直接输入,这样会导致密码泄露。

    查询缓存

    第二步,查询缓存,每次MySQL执行过的语句及其结果会以key-value形式缓存在内存中,key是查询语句,value是查询结果。如果查询能够在缓存中找到key,那么这个value就会被直接返回客户端。

    但是大多数情况下我会建议不要使用缓存,因为查询缓存的失效非常频繁,只要对一个表的更新,即便是更新一些与缓存无关的字段,这个表所有的缓存都会被清空,因此很可能会费劲地把结果存起来,还没使用就被一个更新全部清空,对于更新压力的数据库来说,查询缓存的命中率会非常低,除非业务就一张静态表,很长时间才会更新一次。(例如系统配置表)

    MySQL提供了按需使用的方式,可以将参数query_cache_type设置为DEMAND,这对于默认的SQL不使用查询缓存,而对于确定要使用查询缓存的语句,可以使用SQL_CACHE显示指定。(SELECT SQL_CACHE * FROM TAB)

    通过查询语句做哈希算法得到一个哈希值,因此这里要想命中缓存,查询SQL和缓存SQL必须完全一致,每次检查缓存是否命中时都会对缓存加锁,对于一个读写频繁的系统使用查询缓存很有可能降低查询

    注意:MySQL8.0版本直接将缓存的整个功能模块删掉了

    分析器

    第三步,分析器,如果没有命中缓存,就会执行SQL语句,首先让MySQL知道我们需要做什么,因此需要对SQL语句解析,MySQL从输入的“select”关键字识别出来,这是一条查询语句,把字符串“TAB”识别成表名TAB,检查查询中涉及的表和数据列是否存在或别名是否有歧义

    解析器的工作:语法分析(生成句子),语义分析(确保这些句子讲得通),以及代码生成(为编译准备)

    注意:分析器和解析器是一个东西,有些书叫分析器,有些书叫解析器,就是不同的叫法而已

    优化器

    第四步,优化器,经过分析器MySQL知道我们需要什么了,在开始执行前,还要经过优化器进行处理,优化器是在表里面有多个索引时,决定使用哪个索引,或者在一个语句有多表关联(join)时,决定各个表的连接顺序。

    优化器会生成执行计划

    执行器

    第五步,执行器,MySQL通过分析器知道要做什么,通过优化器知道怎么做,开始执行前,要先判断一下是否有表TABLE查询权限,如果有打开表,根据表的引擎定义,去使用这个引擎提供的接口。

    根据执行计划,调用存储引擎API来查询数据

    展开全文
  • 这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用–log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_time 秒的SQL语句的日志文件,...
  • mysql 如何查看sql语句执行时间

    千次阅读 2020-05-20 22:40:05
    1.show profiles; 刚进入mysql的时候,没有任何操作,此时内容为空。 2.show variables; 查看profiling是否开启,即Vlaue为ON ...直接使用show variables命令会将所有的变量展示出来,... 查看sql语句时间花销...

     

    注意:

    MySQL5.0.37版本以上支持PROFILING调试功能,但是因为它需要调用系统的getrusage函数(用于获取进程资源使用量),所以只是在Linux/Unix类平台上才能使用。

    PROFILING是针对处理进程(process)而不是线程(thread)的;服务器上的其他应用,比如说服务器负载不同,MySQL的响应速度、IO效率等可能不同,从而导致PROFILING结果不同(即便是对同一条SQL语句),因此,这个工具适合开发过程中的调试,如果要在生产环境中调试使用,则要注意它的局限性。

    1.show profiles;

    刚进入mysql的时候,没有任何操作,此时内容为空。

     

    2.show variables; 查看profiling是否开启,即Vlaue为ON

    直接使用show variables命令会将所有的变量展示出来,此时我们可以使用like 命令将profiling挑选出来

    一般没有开启的情况下,此时value都为OFF

     

    3.set profiling=1; 开启profiling

     

    4.使用show profiles; 查看sql语句时间花销。

    展开全文
  • MYSQL时间查询语句大全

    千次阅读 2021-01-18 18:08:27
    SQL语句:复制代码 代码示例:Select * From user Where DATE_FORMAT(birthday,'%m-%d') >...说明:常用时间查询与日期处理函数,上面的主要是DATE_FORMAT()这个函数的应用。1、DAYOFWEEK(date)返回日期da...
  • MySQL - MySQL查询语句执行过程

    万次阅读 2022-04-21 19:38:40
    需要从数据库检索某些符合要求的数据,我们很容易写出 Select A B C FROM T WHERE ID =...Server层包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图.
  • 根据业务需要修改了一个sql查询语句,执行后查询时间平均十几秒,sql语句修改前执行时间不到一秒。因此对sql语句进行优化。sql语句如下: SELECT p.v_contractname AS contractname FROM xq_projectcontract...
  • 系统环境 centos7.5+mysql5.6.46 navicat12.2 测试场景 通过navicat执行一条SQL查询语句执行时间超过5800 解决思路与方法 总结 通过navicat执行一条查询时间过长的语句,想通过kill方式
  • MySQL语句执行情况

    千次阅读 2018-07-31 21:01:04
    下面是对查询语句执行情况的方法介绍。   一、设置STATISTICS STATISTICS选项有PROFILE,IO ,TIME。 SET STATISTICS PROFILE ON:显示每个查询执行后的结果集,代表查询执行的配置文件。 SET STATISTICS IO.....
  • mysql8查看SQL执行语句历史记录

    千次阅读 2022-02-10 23:51:00
    mysql数据库执行语句_mysql中记录SQL执行语句的方法_程序泉的博客-CSDN博客-- 打开sql执行记录功能set global log_output='TABLE'; -- 输出到表set global log=ON; -- 打开所有命令执行记录功能general_log, 所有...
  • 查看mysql已经执行过的sql语句

    千次阅读 2021-01-19 03:53:54
    概述很多时候,我们需要知道 MySQL 执行过哪些 SQL 语句,比如 MySQL 被注入后,需要知道造成什么伤害等等。只要有 SQL 语句的记录,就能知道情况并作出对策。服务器是可以开启 MySQL 的 SQL 语句记录功能,从而就能...
  • mysql查询历史执行sql记录

    千次阅读 2021-11-09 20:51:36
    查看正在执行的sql -- 切换数据库 use information_schema;...2、开启日志模式,记录所有SQL语句执行记录 首先查看日志是否开启了记录 -- 查看日志功能设置状态 show variables like 'general_log'; -
  • 查找MySQL查询语句被阻塞阻塞原因

    千次阅读 2020-12-05 14:05:51
    查询时间不返回,一般碰到这种情况的话,大概率是表t被锁住了。接下来分析原因的时候,一般都是首先执行一下show processlist命令,看看当前语句处于什么状态。 然后我们再针对每种状态,去分析它们产生的原因、...
  • MySQL查询SQL执行时间

    万次阅读 2018-08-18 23:33:11
    show profiles用来查询SQL执行时间,它是mysql 5.0.37之后添加的功能。 1.查看数据库版本信息,登录数据库时显示的信息中会出现数据库版本信息: 2.查看show profiles功能是否开启: 3.开启show profiles功能...
  • MySQL数据库,sql语句比较简单:删除数据前,备份数据是必须的!先来错误的演示:1.先把错误数据查询出来SELECTid,openid,COUNT(*) as recCountFROM tb_wx_user_info_bakGROUP BY openidHAVING COUNT( * ) > ...
  • MySQL查询某一时间段的SQL语句

    千次阅读 2019-01-14 11:42:09
    SELECT * FROM 表名 WHERE 时间字段名 >= CURDATE() 昨天 SELECT * FROM 表名 WHERE 时间字段名 >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND 时间字段名 <= CURDATE() 近7天 SELECT * ...
  • 一条SQL语句执行流程前言MySQL架构 前言 MySQL架构
  • Mysql 执行一条语句的过程

    万次阅读 多人点赞 2022-01-26 18:07:12
    Mysql的逻辑架构 Mysql的逻辑架构如下所示,整体分为两部分,Server层和存储...但是长连接也有优化的空间,即长连接过多,随着执行大的查询操作,会占用较多的内存。 建立连接完成之后,连接器会判断该用户的权限,之后
  • 我们看到的知识输入的一条语句,返回一个结果,却不知道这条语句mysql中内部的执行过程。 所以今天我想和你一起吧mysql拆解一下,看看里面有哪些零件,希望借由这个拆解过程,对mysql有更深入的理解。
  • MySQL中如何查看正在执行的SQL语句

    千次阅读 2021-01-19 08:09:48
    大家都知道,linux环境中很容易通过操作系统top看到执行时间长的进程pid号,根据pid号,再通过oracle的视图v$session,v$process,v$sqltext追到到执行sid,从而查到具体的sql语句。示例如下:SQL语句SELE...
  • 一、mysql查看正在执行的sql语句 show processlist; 二、mysql查看已经执行的历史sql语句(方法:开启日志模式) SETGLOBAL log_output ='TABLE';SETGLOBAL general_log ='ON'; //日志开启 你输入要查的语句,...
  • 转载自:... 查看执行时间 1 show profiles; 2 show variables;查看profiling 是否是on状态; 3 如果是off,则 set profiling = 1;...4 执行自己的sql语句;...就可以查到sql语句执行时间; 查看操作...
  • 查看mysql语句运行时间

    千次阅读 2017-07-12 16:06:08
    为了验证select 1 与 select 1 from ...于是总结一下,查看mysql语句运行时间的方法。 方法一: show profiles。 1. Show profiles是5.0.37之后添加的,要想使用此功能,要确保版本在5.0.37之后。  Query Prof
  • windows 下mysql5.7 慢查询配置 查看慢配置查询的 show variables like '%query%' ; show variables like 'long_query_time' ; //可以显示当前慢查询时间 set long_query_time=1 ; //慢查询时间默认为...
  • 一、根据慢日志定位慢查询sql # 临时开启慢日志(如重启数据库,还会改为默认值off,如需永久改需要修改配置文件) show variables like '%slow_query_log%' ;(如果查询出的值为off则需要开启慢日志) set ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 301,665
精华内容 120,666
关键字:

mysql查询语句执行时间

mysql 订阅