zoukankan      html  css  js  c++  java
  • MYSQL BENCHMARK()函数

    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

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

  • 相关阅读:
    msp430入门学习43
    msp430入门学习42
    msp430入门学习41
    msp430入门学习40
    msp430入门学习37
    msp430入门学习36
    msp430入门学习35
    JAVA三大特性之三——多态
    JAVA三大特性之二——继承
    JAVA三大特性之一——封装
  • 原文地址:https://www.cnblogs.com/duanxz/p/3936759.html
Copyright © 2011-2022 走看看