我只是使用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] 删除。
我来说两句