我在产品表上有索引:
初级的
产品\性别\身份证\国外
产品\子类别\标识\国外
使用的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;使用文件排序
2条答案
按热度按时间i34xakig1#
正如mysql文档中所解释的,在某些情况下可以忽略索引。在您的案例中,可以应用的索引是:
您将索引列与常量值进行比较,mysql已经计算出(基于索引树)常量覆盖了表的很大一部分,并且表扫描会更快。见第8.2.1.1节,“where子句优化”。
您正在通过另一列使用基数较低的键(许多行与键值匹配)。在这种情况下,mysql假设通过使用键,它可能会执行许多键查找,并且表扫描会更快。
我的猜测是category\u id的值不够稀疏
hs1rzwqc2#
就像我在这里说的,这个
需要5列复合索引:
去医院
LIMIT
,因此不必获取大量行并对它们进行排序。至于你的实际问题是它选择了哪个索引。。。可能一个不足指标的基数比另一个好。