Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么';我的查询不使用任何索引吗?_Mysql_Sql_Indexing - Fatal编程技术网

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)
方案A:使用全文并在字段上进行匹配。(全文有一些限制,可能使其无法使用。)

方案B:有一个额外的列和列的连接,并对其执行一个类似操作。(这并不能解决所有问题。)

一句话:如果你生活在索引的约束范围内,索引是非常有效的。您的查询违反了许多限制,因此我认为查询没有任何希望;它必须执行表扫描

警告:可能还有更多问题。

  • 不要在函数调用中隐藏索引列(
    CONCAT
  • 或者对优化来说是致命的
  • 前导通配符(
    %
    )使索引在类似于
    中不可用
  • 由于您正在获取所有列,因此使用“覆盖”索引是不切实际的
  • 在某些情况下,可以使用排序依据的索引来代替中的。但是您混合了ASC和DESC,所以这是不可能的(直到版本8.0)
方案A:使用全文并在字段上进行匹配。(全文有一些限制,可能使其无法使用。)

方案B:有一个额外的列和列的连接,并对其执行一个类似操作。(这并不能解决所有问题。)

一句话:如果你生活在索引的约束范围内,索引是非常有效的。您的查询违反了许多限制,因此我认为查询没有任何希望;它必须执行表扫描


警告:可能还有更多问题。

您正在使用函数的结果。索引(如果有)基于列值而不是函数的结果。此
concat(user_fname',,user_lname)类似于concat(?,,%)
了解有关索引检查的更多信息:MySQL索引还包括此网站和此视频。您正在使用函数的结果。索引(如果有)基于列值,而不是函数的结果。此
concat(user_fname',,user_lname)类似于concat(?,,%)
了解有关索引检查的更多信息:MySQL索引还包括此网站和此视频。