MYSQL:LEFT()不使用任何索引

pat*_*man 3 mysql indexing

我刚刚使用诸如WHERE LEFT(field之类的where条件遇到了我的mysql问题, 4) = "abcd".我目前正在尝试优化我的查询,我注意到它没有使用我定义的任何索引.我认为LEFT()有可能使用指数而SUBSTRING不是?(即在这个问题的答案中提到:MySQL Left()或SUBSTRING()?)

所以在我的例子中,该字段category CHAR(6)在表中被调用image.为了测试,我定义了各种指数:

ALTER TABLE image ADD INDEX `cat` (`category`);
ALTER TABLE image ADD INDEX `cat2` (`category(2)`);
ALTER TABLE image ADD INDEX `cat4` (`category(4)`);
Run Code Online (Sandbox Code Playgroud)

和一个主要索引id,一个简单的字段索引type以及一个FULLTEXT其他列,我不认为他们是mattassaer.

虽然我得到了以下结果:

EXPLAIN SELECT * FROM image i0_ WHERE LEFT(category,4) = "0000" LIMIT 0,30

+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | i0_   | ALL  | NULL          | NULL | NULL    | NULL | 617359 | Using where |

+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

LIKE改为使用:

SELECT * FROM image i0_ WHERE category LIKE "0000%" LIMIT 0,30
Run Code Online (Sandbox Code Playgroud)

这将允许它使用索引.从手册:

如果LIKE的参数是不以通配符开头的常量字符串,则索引也可用于LIKE比较.例如,以下SELECT语句使用索引:

SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';
Run Code Online (Sandbox Code Playgroud)