首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL日期时间函数美与性能(速度)

MySQL日期时间函数美与性能(速度)
EN

Stack Overflow用户
提问于 2013-07-01 14:34:04
回答 2查看 718关注 0票数 2

如果我避免使用内置的mysql日期和时间函数,sql的速度( %)会更快吗?

我什么意思?例如:SELECT id FROM table WHERE WEEKOFYEAR(inserted)=WEEKOFYEAR(CURDATE())

MySQL有很多用于处理日期和时间的buil-in函数,而且它们也很适合。但那进取心呢?

上面的sql可以在没有内置函数的情况下重写,比如:SELECT id FROM table WHERE inserted BETWEEN 'date for 1 day of particular week 00:00:00' AND 'last day of particular week 23:59:59',服务器端代码变得更糟:(但在db端,我们可以使用索引。)

我看到了使用内置函数的两个问题: 1.索引

我做了个小测试

代码语言:javascript
复制
mysql> explain extended select id from table where inserted between '2013-07-01 00:00:00' and '2013-07-01 23:59:59';
+----+-------------+-------+-------+---------------+------+---------+------+------+----------+--------------------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra                    |
+----+-------------+-------+-------+---------------+------+---------+------+------+----------+--------------------------+
|  1 | SIMPLE      | table  | range | ins           | ins  | 4       | NULL |    7 |   100.00 | Using where; Using index |
+----+-------------+-------+-------+---------------+------+---------+------+------+----------+--------------------------+

mysql> explain extended select id from table where date(inserted)=curdate();
+----+-------------+-------+-------+---------------+------+---------+------+--------+----------+--------------------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows   | filtered | Extra                    |
+----+-------------+-------+-------+---------------+------+---------+------+--------+----------+--------------------------+
|  1 | SIMPLE      | table  | index | NULL          | ins  | 4       | NULL | 284108 |   100.00 | Using where; Using index |
+----+-------------+-------+-------+---------------+------+---------+------+--------+----------+--------------------------+

第一次是0.00秒,第二次是第一次,第一次是0.15秒。所有的东西都是用数据的小错误做的。

第二个问题是

  1. 是时候调用那个函数了

如果在table中我有10亿条记录,这意味着WEEKOFYEAR,日期,无论.会被打这么多次,这么多记录,对吧?

那么,如果我停止使用mysql内置的日期和时间函数,它会带来真正的利润吗?

EN

回答 2

Stack Overflow用户

发布于 2013-07-01 14:37:10

WHERE子句中或在JOIN条件下使用列的函数将阻止在列上使用索引(如果存在这种索引)。这是因为列的原始值是索引的,而不是计算值。

请注意,上面的内容不适用于这样的查询:

代码语言:javascript
复制
SELECT id FROM atable WHERE inserted = CURDATE(); -- the raw value of "inserted" is used in the comparison

是的,在此基础上,将对扫描的每一行执行该函数。

票数 1
EN

Stack Overflow用户

发布于 2013-07-01 14:37:12

第二个查询是在表中的每一行上运行date函数,而第一个查询可以只使用索引来查找它需要的行。这将是最严重的经济放缓。查看explain输出中的行列

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17407004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档