mysql多参数怎么用复合索引

公司报表数据量比较大,需要优化,用的是mybatis的动态sql,所以条件会改变,在这种情况下复合索引会失效,请问这种情况应该怎么优化比较好。

如果条件会变,那就别用复合索引,全部建立单独索引。

建立索引的目的是为了提高查询效率。
使用动态SQL,说明查询的条件会有所变化。
复合索引会按照字段的先后顺序依次命中,部分命中的情况下,依然可以被利用到。
一个表的索引数量最好不要超过5个,否则影响插入性能。
把有关这个表的高负载查询都列举出来,也就是动态SQL的所有出现的情况都列举出来。


  • 有些字段是枚举类型的或者布尔类型的,它的值只有极少几个,比如:性别。
    类似这样的数据,建立索引后效率也很难提高。
  • 有些字段是ID类型,几乎每行记录,它的值都会有所不同,比如:记录的插入时间,自增主键等等。
    类似这样的数据,建立索引后会很大程度上提高查询效率。

列举出所有高负载的查询条件,看看这些条件中,哪些条件会频繁出现。

  • 可以将最频繁出现的条件建立索引(如果是复合索引,就排在第一个位置)
  • 如果不频繁出现的条件中,包含类似ID类型的字段,可以给这个字段建立索引

复合索引的命中是有着规律的,比如:
Index_1(A,B,C) 这个索引,有三个字段,那么,它可命中的查询条件是:

  • Where A,B,C
  • Where A,B
  • Where A
    这样一个复合索引,可以搞定三个查询。
    所以,建立复合索引的时候,要综合考虑列举出来的所有查询条件,尽量少的建立索引。

最后,尽量避免全表查询。尽量能分页的就分页,不能分页的弄个最大记录数,全表查询容易产生慢查询和内存泄露。