【MySQL实战45讲】打卡学习第一天

1 一条sql语句的执行流程;

在这里插入图片描述

  1. 连接器

  2. 分析器
    词法分析,语法分析
    MySQL解析过程、执行过程

  3. 优化器

  4. 执行器

2 mysql8 取消查询缓存。为什么取消?

(1) MySQL 查询缓存是查询结果缓存。它将以SEL开头的传入查询与哈希表进行比较,如果匹配,则返回上次执行查询的结果。有一些限制:
查询必须逐字节匹配(查询缓存避免解析)
使用非确定性特征将导致查询不被缓存(包括临时表、用户变量、RAND()、NOW()和UDFs。)
查询缓存旨在不提供陈旧的结果。对基础表的任何修改都会导致这些表的所有缓存失效。
缓存是否可用于 InnoDB 有一些限制(为了尊重 MVCC;当您打开一个事务时,“缓存”可能不代表您预期视图中的数据。)

(2) 随着技术的进步,经过时间的考验,MySQL的工程团队发现启用缓存的好处并不多。
首先,查询缓存的效果取决于缓存的命中率,只有命中缓存的查询效果才能有改善,因此无法预测其性能。
其次,查询缓存的另一个大问题是它受到单个互斥锁的保护。在具有多个内核的服务器上,大量查询会导致大量的互斥锁争用。
通过基准测试发现,大多数工作负载最好禁用查询缓存(5.6的默认设置):query_cache_type = 0

3 优化器的作用是决定选择使用哪一个方案?逻辑是什么

4 你会在数据库的慢查询日志中看到一个 rows_examined
的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。慢查询日志如何查看?

(1) 查看是否开启慢查询
show variables like ‘slow_query%’;

mysql> show variables like 'slow_query%';
+---------------------+--------------------------------------------------------------------+
| Variable_name       | Value                                                              |
+---------------------+--------------------------------------------------------------------+
| slow_query_log      | OFF                                                                |
| slow_query_log_file | D:\Program Files\mysql-8.0.22-winx64\data\DESKTOP-1F24CC4-slow.log |
+---------------------+--------------------------------------------------------------------+

slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)

(2)慢查询开启需要多少秒

mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+

slow_query_log 慢查询开启状态

long_query_time 查询超过多少秒才记录

配置
临时配置

默认没有开启慢查询日志记录,通过命令临时开启:

开启慢查询日志

复制代码
-- 查看慢查询相关参数
show variables like 'slow_query%';
show variables like 'long_query_time%';

-- 设置慢查询相关参数
set global slow_query_log = 'ON';
set global slow_query_log_file = 'C:\Program Files\MySQL\mysql-5.7.24-winx64\data\NJZBXXNB015-slow.log';
set long_query_time = 1;

-- 查看当前日志输出的格式
show variables like '%log_output%';
-- 设置日志输出为表和文件方式
set global log_output = 'FILE,TABLE';

-- 注意:上述命令只对当前生效,当MySQL重启失效,如果要永久生效,需要配置 my.cnf或mysql.ini
-- [mysqld]下的下方加入
/*slow_query_log = 1
long_query_time = 1
log_output = FILE,TABLE*/

永久配置

修改配置文件达到永久配置状态:
在mysql安装目录:
linux下找到 /etc/mysql/conf.d/mysql.cnf
Windows找到mysql.ini

修改为以下配置,即可开启慢查询

[mysqld]
slow_query_log = ON
slow_query_log_file = /var/lib/mysql/instance-1-slow.log
long_query_time = 2

配置好后,重新启动 MySQL 即可。

5 课后练习

如果表 T 中没有字段 k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?

答:分析器阶段

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值