Mysql 第二列基数较低的复合索引是否会对性能产生足够的影响,因此应该使用它? 安装程序

Mysql 第二列基数较低的复合索引是否会对性能产生足够的影响,因此应该使用它? 安装程序,mysql,sql,ruby-on-rails,indexing,Mysql,Sql,Ruby On Rails,Indexing,我在Rails中使用单表继承(STI),简化如下: class Vehicle belongs_to :user end class Car < Vehicle end class Plane < Vehicle end 使用索引时,维护索引(单列或多列)的成本几乎总是被性能改进所抵消。这是每个插入/删除的一个小增量,如果通过更新更改索引字段的值,则会增加成本。(更新这种情况很少见。)因此,不要担心“维护复合索引”的成本 需要索引(用户id,类型) 优化器将 发现该索引是一

我在Rails中使用单表继承(STI),简化如下:

class Vehicle
  belongs_to :user
end

class Car < Vehicle
end

class Plane < Vehicle
end

使用索引时,维护索引(单列或多列)的成本几乎总是被性能改进所抵消。这是每个
插入
/
删除
的一个小增量,如果通过
更新
更改索引字段的值,则会增加成本。(更新这种情况很少见。)因此,不要担心“维护复合索引”的成本

需要
索引(用户id,类型)

优化器将

  • 发现该索引是一个可能的候选索引
  • 那么,检查一下统计数据
  • 要么使用索引,要么确定基数很差,然后简单地扫描表
  • 包括索引;别担心

    我按照这种方式排序字段,而不是基于中的
    (类型,用户id)
    ,这意味着有时可能会有多个
    类型的值

    如果表中的所有行都有
    type='Car'
    ,则没有问题。我所说的一切仍然适用。包含不必要的
    类型
    的浪费是微不足道的


    最好先在索引中包含所有“=”列,然后最多包含一个其他字段

    我删除了Postgres标记,因为语法是MySQL。对此我很抱歉。与Postgres相比,哪一部分使其具有MySQL特定性?虽然我目前正在使用MySQL,但我更感兴趣的是一个非特定于供应商的答案。回击是一种赠品。哈哈,谢谢,我想我已经很久没有优化Postgres了,我忘了。
    SELECT `vehicles`.* FROM `vehicles` WHERE `vehicles`.`type` IN ('Car')
      AND `vehicles`.`user_id` = 10
    
    WHERE `vehicles`.`type` IN ('Car')
      AND `vehicles`.`user_id` = 10