gpt4 book ai didi

mysql - 为什么我的查询不使用任何索引?

转载 作者:行者123 更新时间:2023-11-29 06:56:12 26 4
gpt4 key购买 nike

这是我的查询:

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_fname,user_lname)users(user_lname)

这是EXPLAIN的结果:

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) 中隐藏索引列,
  • OR 对于优化来说是致命的,
  • 前导通配符 (%) 导致索引在 LIKE 中无法使用,
  • 由于您要提取所有列,因此拥有“覆盖”索引是不切实际的。
  • 在某些情况下,可以使用 ORDER BY 的索引来代替 WHERE。但是你有 ASC 和 DESC 的混合,所以这是不可能的(直到版本 8.0)。

计划 A:在字段上使用全文和匹配。 (全文存在限制,可能会使其无法使用。)

B 计划:有一个额外的列,其中包含列的串联,并对它执行单个 LIKE。 (这并不能解决所有问题。)

底线:如果您生活在索引的约束范围内,索引就会非常高效。您的查询违反了很多限制,我认为该查询没有任何希望;它必须执行表扫描。

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

关于mysql - 为什么我的查询不使用任何索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45510562/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com