简体   繁体   English

MySQL 5.5 在 WHERE 子句中使用 CASE 语句时不使用索引

[英]MySQL 5.5 doesn't use index when using a CASE statement inside a WHERE clause

I have a table of vehicles with a VARCHAR(16) PRIMARY key on a field called "stockno".我在名为“stockno”的字段上有一个带有 VARCHAR(16) PRIMARY 键的车辆表。 The table has over 9K records.该表有超过 9K 条记录。 I am trying to to develop an api that returns a list of vehicles if a stockno arg is null otherwise it returns the specified stockno.我正在尝试开发一个 api,如果 stockno arg 为空,则返回车辆列表,否则返回指定的 stockno。 However when I run an EXPLAIN on the query below the index is not use.但是,当我在下面的查询上运行 EXPLAIN 时,不使用索引。

SET @stockno = 'abc';
SELECT stockno FROM vehicles WHERE CASE WHEN @stockno IS NOT NULL THEN vehicles.stockno = @stockno ELSE 1 = 1 END

I have tried: SELECT stockno FROM vehicles WHERE CASE WHEN @stockno IS NOT NULL THEN vehicles.stockno = CONVERT(@stockno USING latin1) ELSE 1 = 1 END我试过: SELECT stockno FROM vehicles WHERE CASE WHEN @stockno IS NOT NULL THEN vehicles.stockno = CONVERT(@stockno USING latin1) ELSE 1 = 1 END

Also when I run SELECT stockno FROM vehicles WHERE stockno = 'abcdef' the index is used.同样,当我运行SELECT stockno FROM vehicles WHERE stockno = 'abcdef' ,使用了索引。

Edit This statement will eventually be used as a view.编辑此语句最终将用作视图。

You can change the query to use UNION ALL您可以更改查询以使用 UNION ALL

SET @stockno = 'abc';
SELECT stockno
FROM vehicles
WHERE @stockno IS NOT NULL
AND vehicles.stockno = @stockno
UNION ALL
SELECT stockno
FROM vehicles
WHERE @stockno IS NULL;

在查看 SQL 后,我认为通过 API 创建动态 SQL 字符串是最简单的方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM