Mysql 为什么';我的查询不使用任何索引吗?
我的问题是:Mysql 为什么';我的查询不使用任何索引吗?,mysql,sql,indexing,Mysql,Sql,Indexing,我的问题是: select u.*, concat(user_fname, ' ', user_lname) like concat(?, '%') `both`, user_lname like ? last_name from users u where concat(user_fname, ' ', user_lname) like concat(?, '%') or user_lname like concat(?, '%') order by `bo
select u.*,
concat(user_fname, ' ', user_lname) like concat(?, '%') `both`,
user_lname like ? last_name
from users u
where concat(user_fname, ' ', user_lname) like concat(?, '%')
or user_lname like concat(?, '%')
order by `both`*2 DESC, last_name
我还有两个索引:users(user\u fname,user\u lname)
,users(user\u lname)
下面是解释的结果:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 | SIMPLE | u | ALL | user_lname | NULL | NULL | NULL | 9 | Using where
看到了吗?它不使用任何索引。为什么?如何使查询达到最佳状态?- 不要在函数调用中隐藏索引列(
)CONCAT
- 或者对优化来说是致命的
- 前导通配符(
)使索引在类似于%
的
中不可用
- 由于您正在获取所有列,因此使用“覆盖”索引是不切实际的
- 在某些情况下,可以使用排序依据的索引来代替中的。但是您混合了ASC和DESC,所以这是不可能的(直到版本8.0)
- 不要在函数调用中隐藏索引列(
)CONCAT
- 或者对优化来说是致命的
- 前导通配符(
)使索引在类似于%
的
中不可用
- 由于您正在获取所有列,因此使用“覆盖”索引是不切实际的
- 在某些情况下,可以使用排序依据的索引来代替中的。但是您混合了ASC和DESC,所以这是不可能的(直到版本8.0)
警告:可能还有更多问题。您正在使用函数的结果。索引(如果有)基于列值而不是函数的结果。此
concat(user_fname',,user_lname)类似于concat(?,,%)
了解有关索引检查的更多信息:MySQL索引还包括此网站和此视频。您正在使用函数的结果。索引(如果有)基于列值,而不是函数的结果。此concat(user_fname',,user_lname)类似于concat(?,,%)
了解有关索引检查的更多信息:MySQL索引还包括此网站和此视频。