以下是查询
SELECT * FROM mytable WHERE if(@type=1,col1,col2) = 1420070400;
@type
是一个会话变量。
我在indexes
和col1
列上都定义了两个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 |
+----+-------------+-----------------+------+---------------+------+---------+------+------+----------+-------------+
答案 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)
上。注意:单个复合索引是不够的。