我有两张桌子,用户和产品。在用户中有4个用户,产品有一个fk到用户(列user_id)。
在产品中有2395288条记录,其中765277条为user_id = 4。
如果我没有索引的话
从user_id =4的产品中解释select *;
我得到了

所以,我增加了一个索引
在产品上创建索引用户ON (User_id)
之后,我又执行了一次,但是索引不起作用:
从user_id =4的产品中解释select *;

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

但是我需要索引来选择*或者选择名称,对产品的描述,其中user_id =x
发布于 2021-03-04 14:47:30
通常,MySQL的优化器认为,如果您搜索该列中常见的值(例如,超过20%的行与该值匹配),则它决定不使用该索引,因为在索引中查找值,然后再进行另一次查找以获得找到该值的行是更多的工作。
20%的阈值不是一个官方的断点,它只是我观察到的。
如果你认为优化器做错了选择,你可以给它一个索引提示来说服它,一个表格扫描是更昂贵的。
select ... from products FORCE INDEX(userid) where user_id = 4;我只在必要时尝试使用索引提示。通常,MySQL优化器在没有提示的情况下做出正确的选择。此外,使用索引提示意味着我的查询现在与该索引绑定在一起,因此如果我想在某一天删除索引,则需要首先更改查询。
https://stackoverflow.com/questions/66477190
复制相似问题