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

帕特曼

我只是使用where条件(例如WHERE LEFT(field)遇到了我的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)`);

还有一个主要索引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 |

+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
马克·拜尔斯

使用LIKE来代替:

SELECT * FROM image i0_ WHERE category LIKE "0000%" LIMIT 0,30

这将允许它使用索引。手册

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

SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章