1. select 语句来查看sql 语句执行的时间
我一直使用mysql 图形化工具来操作数据库,查看某条SQL 语句执行的时间也是通过图形化工具来查看。前两天遇到了一个问题,就是 怎 么样查看一个mysql执行一个sql 表达式所需的时间,也就是执行 where 条件的时间,通过 例如我想知道
to_days(MYDATE) - to_days(now()) <1 执行一次的时间 其中 MYDATE 是数据表中的一个时间戳字段。
如果单纯的用 select to_days(MYDATE) - to_days(now()) <1 大概是0.0011秒
2. benchmark 使用方法:
这里还有一种方法能够获取到 mysql 执行一个sql 语句或sql 表达式的 时间,并且可以由用户指定执行次数。通过执行大规模次数, 才能够获得比较稳定的 sql 执行时间。
select benchmark(num, exp) ; 其中 num 为执行次数,exp 为希望获得执行时间的表达式 ,不包括 sql 语句
select benchmark(1, to_days(2011-04-07) - to_days(now()) <1 ); 执行时间大概是 0.0011秒 ,可以计算表达式时间
select benchmark(1, select * from MYTABLE limit 0,40 ); Mysql 报错,说明EXP 不能为sql 语句,只能为表达式或函数
下面是对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 不能用来完成一种实际的 基准测试。
3. 使用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秒
select benchmark(1, 2011-01-01>'date("Y-m-d",time())') 执行时间大概也是 0.0249秒
通过上面的比较发现 2011-01-01>'date("Y-m-d",time()) 和 to_days(2011-04-07) - to_days(now()) <1
在大数据量比较时执行速度更快。
在实际的web 网页应用中也证实了这一点。