当条件有if子句时,MySQL不使用索引

时间:2015-06-01 12:43:26

标签: mysql indexing

以下是查询

SELECT * FROM mytable WHERE if(@type=1,col1,col2) = 1420070400;

@type是一个会话变量。

我在indexescol1列上都定义了两个col2,但在这种情况下mysql不使用。有什么办法可以让mysql使用index吗?

以下是解释结果

mysql> explain extended SELECT * FROM mytable WHERE if(@type=1,col1,col2) = 1420070400;
+----+-------------+-----------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table           | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-----------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | mytable         | ALL  | NULL          | NULL | NULL    | NULL | 1523 |   100.00 | Using where |
+----+-------------+-----------------+------+---------------+------+---------+------+------+----------+-------------+

1 个答案:

答案 0 :(得分:2)

通常,当列是函数的参数时,数据库(包括MySQL)不使用索引。

你可以尝试:

WaitIterator

但是,它也不太可能使用索引。您可以像这样说出查询:

SELECT *
FROM mytable
WHERE (@type = 1 and col1 = 1420070400) or
      (@type <> 1 and col2 = 1420070400);

SELECT * FROM mytable WHERE @type = 1 and col1 = 1420070400 UNION ALL SELECT * FROM mytable WHERE @type <> 1 and col2 = 1420070400 没问题,因为实际上只应运行其中一个子查询。此版本应使用两个单独的索引,一个在UNION ALL上,另一个在mytable(col1)上。注意:单个复合索引是不够的。