MySQL有一个内置的BENCHMARK()函数,可以测试某些特定操作的执行速度。

BENCHMARK(count,expr)

BENCHMARK会重复计算expr表达式count次,通过这种方式就可以评估出mysql执行这个expr表达式的效率。这个函数的返回值始终是0,但可以根据客户端提示的执行时间来得到BENCHMARK总共执行的所消耗的时间,如以下这个例子

mysql> SELECT BENCHMARK(1000000,ENCODE('hello','goodbye'));
+----------------------------------------------+
| BENCHMARK(1000000,ENCODE('hello','goodbye')) |
+----------------------------------------------+
| 0 |
+----------------------------------------------+
1 row in set (4.74 sec)

上面例子中的4.74 秒指的是在mysql客户端总共消耗的时间。

BENCHMARK函数只能测量数字表达式(scalar expression)的性能,虽然说表达式可以是一个子查询,但子查询返回的只能是单个值。在BENCHMARK(10, (SELECT * FROM t)) 这个语句中,如果t表有多列或是t表中记录多于1行的话这个函数就会执行失败。BENCHMARK函数在执行多次的过程中sql的解析(parser)、优化(optimizer)、锁表(table locking)等操作只会进行一次,只有运行评估(runtime evaluation)会执行count次。 利用BENCHMARK,mysql就可以自动为我们多次执行表达式计算,从而获取比较平均的计算结果。

下面是对num 赋予不同的数值,查看执行不同次数所耗费的时间

select benchmark(100, to_days(2011-04-07) - to_days(now()) <1 ); 执行时间大概也是 0.0012秒

select benchmark(10000, to_days(2011-04-07) - to_days(now()) <1 ); 执行时间大概也是 0.0056秒

select benchmark(1000000, to_days(2011-04-07) - to_days(now()) <1 ); 执行时间大概也是 0.4454秒

为什么执行100次和执行 1次的时间耗费差不多呢? 这是因为可能被注入了缓存的缘故,因此benchmark 不能用来完成一种实际的基准测试。

如果我想比较 2011-01-01>'date("Y-m-d",time()) 和 to_days(2011-04-07) - to_days(now()) <1 两个表达式中哪个表达式执行速度更快怎么办?

select to_days(2011-01-01)-to_days(now())<1 执行时间大概也是 0.0011秒

select 2011-01-01>'date("Y-m-d",time())' 执行时间大概也是 0.0011秒

通过这种方式是无法比较的。

select benchmark(1, 2011-01-01>'date("Y-m-d",time())') 执行时间大概也是 0.0011秒

select benchmark(1, to_days(2011-04-07) - to_days(now()) <1 ); 执行时间大概也是 0.0011秒

通过这种方式也无法比较,但是我们知道,mysql 使用内置函数肯定是要耗费一定的时间的,也就是第二个表达式比第一个表达式执行速度更慢。

但在某些场合,还是可以比较两种表达式的执行速度的:

select benchmark(1, 2011-01-01>'date("Y-m-d",time())') 执行时间大概也是 0.0011秒

select benchmark(100, 2011-01-01>'date("Y-m-d",time())') 执行时间大概也是 0.0011秒

select benchmark(10000, 2011-01-01>'date("Y-m-d",time())') 执行时间大概也是 0.0013秒

通过上面的比较发现 2011-01-01>'date("Y-m-d",time()) 和 to_days(2011-04-07) - to_days(now()) <1

在大数据量比较时执行速度更快。

最新文章

  1. iframe自适应高度
  2. 概率论与数理统计讲课PPT和往年期末试卷
  3. 【原】javascript数组操作
  4. StructureMap使用方法(转)
  5. NHibernate系列文章十八:NHibernate关系之一对多(附程序下载)
  6. ios 用LLDB查看模拟器文件路径以及一些常用的命令
  7. JPA2.1 中三个提升应用性能的新功能
  8. MySQL 基础学习
  9. 【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象
  10. ps-ef|grep-vgrep|grepsep|awk&#39;{print&quot;kill-9&quot;$2}&#39;|sh 这个表达式到底是什么意思啊?
  11. Java复习总结——继承
  12. 2018-2019-2 《网络对抗技术》Kali安装 Week1 20165236
  13. Perl导入代码文件
  14. VOC标签转化为YOLO标签
  15. APIO2018 铜滚记
  16. [No0000F8]override和new的区别
  17. 微信小程序简易table组件实现
  18. XE里, TStringField 还是 ansi的
  19. 大话 .Net 之内存管理
  20. 装部署VMware vSphere 5.5文档 (6-2) 为IBM x3850 X5服务器安装配置VMware ESXi

热门文章

  1. ResourceBundle和properties 读取配置文件区别
  2. C++字符串操作库函数
  3. IOS 被拒 关于 iPhone running iOS 10.3.1 on Wi-Fi connected to an IPv6 network.
  4. TCP的带宽估计和丢包恢复
  5. uvalive 6932
  6. Java中的算术运算符
  7. 考虑 PHP 5.0~5.6 各版本兼容性的 cURL 文件上传
  8. UML类图(二)----------类与类之间的关系之关联(聚合与组合)
  9. 隔行换色(WPF DataGrid 标准例子)
  10. CentOS7 常用命名整理