mysql多列索引使用错误的索引

mu0hgdu0  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(318)

我在产品表上有索引:
初级的
产品\性别\身份证\国外
产品\子类别\标识\国外
使用的idx\U产品\U类别\U子类别\U性别\U(多列索引)
查询:

select `id`, `name`, `price`, `images`, `used`
from `products`
where `category_id` = '1' and
      `subcategory_id` = '2' and
      `gender_id` = '1' and
      `used` = '0'
order by `created_at` desc
limit 24 offset 0

问题:
mysql为什么使用索引
产品\子类别\标识\国外
代替
使用的idx\U产品\U类别\U子类别\U性别\U(多列索引)
以下是解释:
1简单产品空引用产品\u性别\u id \u国外,产品\u子类别\u id。。。产品\子类别\标识\国外5 const 2 2.50使用索引条件;使用where;使用文件排序

i34xakig

i34xakig1#

正如mysql文档中所解释的,在某些情况下可以忽略索引。在您的案例中,可以应用的索引是:
您将索引列与常量值进行比较,mysql已经计算出(基于索引树)常量覆盖了表的很大一部分,并且表扫描会更快。见第8.2.1.1节,“where子句优化”。
您正在通过另一列使用基数较低的键(许多行与键值匹配)。在这种情况下,mysql假设通过使用键,它可能会执行许多键查找,并且表扫描会更快。
我的猜测是category\u id的值不够稀疏

hs1rzwqc

hs1rzwqc2#

就像我在这里说的,这个

where `category_id` = '1' and
      `subcategory_id` = '2' and
      `gender_id` = '1' and
      `used` = '0'
order by `created_at` desc
limit 24 offset 0

需要5列复合索引:

INDEX(category_id, subcategory_id, gender_id, used,  -- in any order
      created_at)

去医院 LIMIT ,因此不必获取大量行并对它们进行排序。
至于你的实际问题是它选择了哪个索引。。。可能一个不足指标的基数比另一个好。

相关问题