繁体   English   中英

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

[英]Mysql multiple column index using wrong index

我在产品表上有索引:

  1. products_gender_id_foreign
  2. products_subcategory_id_foreign
  3. idx_products_cat_subcat_gender_used (多列索引)

查询:

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使用索引

products_subcategory_id_foreign

装的

idx_products_cat_subcat_gender_used(多列索引)

在这里说明:

1 SIMPLE产品NULL ref products_gender_id_foreign,products_subcategory_id ... products_subcategory_id_foreign 5 const 2 2.50使用索引条件; 在哪里使用 使用文件排序

MySQL文档中所述,在某些情况下可以忽略索引。 由于已经使用了一个索引,因此可能适用于您的情况是:

  • 您正在将索引列与常量值进行比较,而MySQL已计算(基于索引树)(常量覆盖了表的很大一部分)并且表扫描会更快。 请参见第8.2.1.1节“ WHERE子句优化”。

  • 您正在通过另一列使用基数较低的键(许多行与键值匹配)。 在这种情况下,MySQL假定通过使用键,它可能会执行许多键查找,并且表扫描会更快。

我的猜测是category_id的值不够稀疏

就像我在这里说的

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 ,从而不必获取很多行并对它们进行排序。

至于您实际选择哪个索引的问题……一个索引不足的基数可能比另一个索引的基数好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM