使用 where 查询不使用索引

时间:2021-03-04 14:35:49

标签: mysql database indexing

我有两个表,用户和产品。在用户中有 4 个用户,产品对用户有一个 fk(列 user_id)。

产品中有 2395288 条记录,其中 user_id = 4 的有 765277 条记录。

如果我这样做没有索引

<块引用>

解释 select * from products where user_id = 4;

我明白

enter image description here

所以,我添加了一个索引

<块引用>

CREATE INDEX userid ON products(user_id)

之后,我再次执行,但索引不起作用:

<块引用>

解释 select * from products where user_id = 4;

enter image description here

仅当我选择 count(*) 或选择 user_id 时才有效

enter image description here

但我需要索引来选择 * 或选择名称,对 user_id = x 的产品的描述

1 个答案:

答案 0 :(得分:2)

一般情况下,MySQL的优化器认为,如果你搜索的是该列中常见的值,例如超过大约20%的行与该值匹配,那么它决定不使用索引,因为查找值在索引中,然后进行另一次查找以获取找到该值的行是更多工作。

20% 的阈值不是官方断点,只是我观察到的。

如果您认为优化器做出了错误的选择,您可以给它一个 index hint 以说服它进行表扫描的成本要高得多。

select ... from products FORCE INDEX(userid) where user_id = 4;

我只在必要时才尝试使用索引提示。通常 MySQL 优化器会在没有提示的情况下做出正确的选择。还使用索引提示意味着我的查询现在与该索引相关联,因此如果有一天我想删除索引,我需要先更改查询。

相关问题