我刚刚使用诸如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)
LIKE改为使用:
SELECT * FROM image i0_ WHERE category LIKE "0000%" LIMIT 0,30
Run Code Online (Sandbox Code Playgroud)
这将允许它使用索引.从手册:
如果LIKE的参数是不以通配符开头的常量字符串,则索引也可用于LIKE比较.例如,以下SELECT语句使用索引:
Run Code Online (Sandbox Code Playgroud)SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';
| 归档时间: |
|
| 查看次数: |
1071 次 |
| 最近记录: |