我有两个表,用户和产品。在用户中有 4 个用户,产品对用户有一个 fk(列 user_id)。
产品中有 2395288 条记录,其中 user_id = 4 的有 765277 条记录。
如果我这样做没有索引
<块引用>解释 select * from products where user_id = 4;
我明白
所以,我添加了一个索引
<块引用>CREATE INDEX userid ON products(user_id)
之后,我再次执行,但索引不起作用:
<块引用>解释 select * from products where user_id = 4;
仅当我选择 count(*) 或选择 user_id 时才有效
但我需要索引来选择 * 或选择名称,对 user_id = x 的产品的描述
答案 0 :(得分:2)
一般情况下,MySQL的优化器认为,如果你搜索的是该列中常见的值,例如超过大约20%的行与该值匹配,那么它决定不使用索引,因为查找值在索引中,然后进行另一次查找以获取找到该值的行是更多工作。
20% 的阈值不是官方断点,只是我观察到的。
如果您认为优化器做出了错误的选择,您可以给它一个 index hint 以说服它进行表扫描的成本要高得多。
select ... from products FORCE INDEX(userid) where user_id = 4;
我只在必要时才尝试使用索引提示。通常 MySQL 优化器会在没有提示的情况下做出正确的选择。还使用索引提示意味着我的查询现在与该索引相关联,因此如果有一天我想删除索引,我需要先更改查询。