处理函数时的MySQL索引问题

时间:2011-12-26 15:42:44

标签: mysql indexing

我正在进行两次查询

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()相同的年份的所有日期,使用函数需要更长的时间而不是直接使用。

这个例子很简单但后来我的函数会返回一个特定的日期,我想了解发生了什么。

2 个答案:

答案 0 :(得分:0)

MySQL扫描每个结果以匹配where条件,因为当你使用用户定义的函数时,mysql没有使用索引。

答案 1 :(得分:0)

我的假设是MySQL知道它可以将YEAR()now()函数计算为某个常量值,因此在评估它们之后(在执行查询之前),它可以使用索引{{1} }。

MySQL不能对您的自定义函数执行相同的操作