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

时间:2015-09-11 12:35:59

标签: mysql indexing

我刚使用WHERE LEFT(字段, 4) = "abcd"等where条件遇到了我的mysql问题。我目前正在尝试优化我的查询,我注意到它没有使用我定义的任何索引。我认为LEFT()有可能使用索引而SUBSTRING不是吗? (即在这个问题的答案中提到:MySQL Left() or 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,我认为它们并不重要。

虽然我得到了以下结果:

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 |

+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+

2 个答案:

答案 0 :(得分:6)

改为使用LIKE

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

这将允许它使用索引。来自manual

  

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

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

答案 1 :(得分:1)

如果您在搜索中使用函数,那么它将不会使用索引,而是您可以使用类似但左侧应该是常量而不是变量,如@Mark Byers建议的那样。

下面的语句不会使用索引

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

下面的语句也不会使用索引

SELECT * FROM image WHERE categor like "%0000%" LIMIT 0,30

下面的语句将使用索引

SELECT * FROM image WHERE categor like "0000%" LIMIT 0,30