是否有必要在SQL表中的每个可查询字段组合上建立索引以优化性能?

soh*_*970 7 mysql sql database indexing

如果我的User表有几个可查询的字段(例如DepartmentId,GroupId,RoleId),如果我为这些字段的每个组合创建索引,它会产生任何速度差异吗?

通过"可查询",我指的是一个查询屏幕,最终用户可以通过从下拉列表中选择,根据部门,组或角色选择记录.

目前,我有一个关于DepartmentId,GroupId和RoleId的索引.这是每个字段的单个非唯一索引.

如果最终用户选择"B组中的任何人",则SQL看起来像:

select * from User where GroupId = 2
Run Code Online (Sandbox Code Playgroud)

拥有GroupId的索引应该加快速度.

但是如果最终用户选择"B组和角色C中的任何人",则SQL将如下所示:

select * from User where GroupId = 2 and RoleId = 3
Run Code Online (Sandbox Code Playgroud)

单独拥有GroupId和RoleId的索引可能没有任何区别,对吧?

为寻求更好的指标是,如果我有一个指数跨越两个 groupId和角色ID.

但如果是这样的话,那就意味着我需要为可查询字段的每个组合都有一个索引.所以我需要所有这些索引:

  • DepartmentID的
  • GroupId的
  • 角色ID
  • DepartmentId和GroupId
  • DepartmentId和RoleId
  • GroupId和RoleId
  • 部门ID,GroupId和RoleId

任何人都可以对此有所了解吗?我正在使用MySQL,如果这有所作为.

Joe*_*lli 8

多列索引可用于该索引的任何左前缀.因此,(A,B,C)上的索引可用于(A),(A,B)和(A,B,C)上的查询,但它不能用于(B)上的查询)或(B,C).

如果列都是单独索引的,则MySQL(5.0或更高版本)也可以使用索引合并优化.