我正在进行两次查询
SELECT * FROM datedim WHERE year = YEAR(now());
和
SELECT * FROM datedim WHERE year = YEAR(getNow());
这里getNow()函数只返回NOW();
我的问题是,第一个是立即的,而第二个需要更长的时间。 (1.xx秒)
当我执行explain命令时,我有第一个(这是好的)
+----+-------------+---------+------+---------------+-------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+-------------+---------+-------+------+-------------+
| 1 | SIMPLE | datedim | ref | dd_year_idx | dd_year_idx | 5 | const | 365 | Using where |
+----+-------------+---------+------+---------------+-------------+---------+-------+------+-------------+
但这是第二个(这是非常糟糕的)
+----+-------------+---------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+-------+-------------+
| 1 | SIMPLE | datedim | ALL | NULL | NULL | NULL | NULL | 10958 | Using where |
+----+-------------+---------+------+---------------+------+---------+------+-------+-------------+
有人可以向我解释发生了什么以及为什么要做同样的事情,寻找与NOW()相同的年份的所有日期,使用函数需要更长的时间而不是直接使用。
这个例子很简单但后来我的函数会返回一个特定的日期,我想了解发生了什么。
答案 0 :(得分:0)
MySQL扫描每个结果以匹配where条件,因为当你使用用户定义的函数时,mysql没有使用索引。
答案 1 :(得分:0)
我的假设是MySQL知道它可以将YEAR()
和now()
函数计算为某个常量值,因此在评估它们之后(在执行查询之前),它可以使用索引{{1} }。
MySQL不能对您的自定义函数执行相同的操作