如果我避免使用内置的mysql日期和时间函数,那么sql的速度会快多少(%)?
我的意思是什么?例如:SELECT id FROM table WHERE WEEKOFYEAR(inserted)=WEEKOFYEAR(CURDATE())
MySQL有很多内置函数可以处理日期和时间,它们也很合适。但是性能呢?
上面的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端我们可以使用索引
我看到使用内置函数的两个问题: 索引
我做了小测试
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。一切都是用很少的数据制作的。
和第二个问题,是
如果在table
我有10亿条记录就意味着WEEKOFYEAR,DATE无论如何......会被召唤这么多次,我们有多少记录,对吧?
所以,如果我停止使用mysql内置的日期和时间函数,它会带来真正的利润吗?
答案 0 :(得分:1)
如果存在此类索引,则使用WHERE
子句或JOIN
条件中的列函数将阻止在列上使用索引。这是因为列的原始值被索引,而不是计算值。
请注意,上述内容不适用于此类查询:
SELECT id FROM atable WHERE inserted = CURDATE(); -- the raw value of "inserted" is used in the comparison
是的,除此之外,该功能将针对扫描的每一行执行。
答案 1 :(得分:0)
第二个查询在表中的每一行上运行日期函数,而第一个查询只能使用索引来查找所需的行。那是最大的放缓。查看explain输出中的rows列