我刚使用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 |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
答案 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