[英]Mysql multiple column index using wrong index
我在产品表上有索引:
查询:
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.