前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >揭秘MySQL SLEEP()函数:避免这些常见误区,不再被时间迷惑!

揭秘MySQL SLEEP()函数:避免这些常见误区,不再被时间迷惑!

作者头像
July
发布2023-11-22 15:30:02
4080
发布2023-11-22 15:30:02
举报
文章被收录于专栏:数据库干货铺数据库干货铺

关于MySQL sleep()函数,很多同学会觉得这个很简单,但是在和研发同学沟通时发现,很多人对此函数存在误解,本文举3个典型的例子进行说明。

1.误区一

以下SQL的运行结果是什么样的

代码语言:javascript
复制
SELECT NOW(),SLEEP(2),NOW();

很多人会认为得到的结果中第二个now()的结果是第一个now()的结果的加2s。但实际运行的结果是什么呢?

代码语言:javascript
复制
mysql> SELECT NOW(), SLEEP(2), NOW();
+---------------------+----------+---------------------+
| NOW()               | SLEEP(2) | NOW()               |
+---------------------+----------+---------------------+
| 2023-11-21 20:11:41 |        0 | 2023-11-21 20:11:41 |
+---------------------+----------+---------------------+
1 row in set (2.00 sec)

实际结果前后2个值是一致的。

那如果想前后不一致,则需要改为SYSDATE()函数,例如:

代码语言:javascript
复制
mysql> SELECT NOW(), SLEEP(2), SYSDATE();
+---------------------+----------+---------------------+
| NOW()               | SLEEP(2) | SYSDATE()           |
+---------------------+----------+---------------------+
| 2023-11-21 20:13:15 |        0 | 2023-11-21 20:13:17 |
+---------------------+----------+---------------------+
1 row in set (2.00 sec)

mysql> SELECT NOW(),SYSDATE(), SLEEP(2), SYSDATE();
+---------------------+---------------------+----------+---------------------+
| NOW()               | SYSDATE()           | SLEEP(2) | SYSDATE()           |
+---------------------+---------------------+----------+---------------------+
| 2023-11-21 20:13:32 | 2023-11-21 20:13:32 |        0 | 2023-11-21 20:13:34 |
+---------------------+---------------------+----------+---------------------+
1 row in set (2.00 sec)

以上是在MySQL5.7环境下执行的结果,有人会问8.0中会不会有变化呢,但其实运行结果也是一致。

2. 误区二

”sleep(n)中的n只能是正整数,如果是小数会进行取整”

那真实情况会如何呢?

代码语言:javascript
复制
mysql> select sleep(2.8);
+------------+
| sleep(2.8) |
+------------+
|          0 |
+------------+
1 row in set (2.80 sec)

mysql> select sleep(2);
+----------+
| sleep(2) |
+----------+
|        0 |
+----------+
1 row in set (2.00 sec)

mysql> select sleep(3);
+----------+
| sleep(3) |
+----------+
|        0 |
+----------+
1 row in set (3.00 sec)

真实情况是,MySQL可以做的精确到对应的时间,而不是谣言中所说的只能是整数。

而且MySQL8.0版本依旧如此:

3. 误区三

当一个表tb1中有2条数据,那么以下SQL的运行结果会是如何?

代码语言:javascript
复制
 select a.*,sleep(2) from tb1 a

误区结果:a表的记录,总共耗时大约2s(查询a表的时间加上休眠的2s)

而实际结果是:

代码语言:javascript
复制
mysql> select a.*,sleep(2) from tb1 a;
+----+---------------------+---------------------+----------+
| id | ts                  | dt                  | sleep(2) |
+----+---------------------+---------------------+----------+
|  1 | 2038-01-01 00:00:00 | 2038-01-01 00:00:00 |        0 |
|  2 | 2038-01-01 00:00:00 | 2039-01-01 00:00:00 |        0 |
+----+---------------------+---------------------+----------+
2 rows in set (4.00 sec)

耗时4s,也就是 记录数*休眠时间

TIPS:

如果一个表中的记录数很大,而误写成此情况的SQL将一直阻塞从而造成不必要的灾难。

注:以上是与研发沟通时发现的大家对此函数的误解,其实还有很多情况也有此类误解,因此建议大家一定要亲自验证,以免以讹传讹。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据库干货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档