【问题标题】:Query with where is not use index查询 where 不使用索引
【发布时间】:2021-03-04 14:35:49
【问题描述】:

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

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

如果我这样做没有索引

说明 select * from products where user_id = 4;

我明白了

所以,我添加了一个索引

在产品上创建索引用户 ID(user_id)

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

说明 select * from products where user_id = 4;

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

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

【问题讨论】:

    标签: mysql database indexing


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多