MySQL单列索引和多列索引

在设计MySql表索引的时候,可能有个问题,就是多个单列索引好,还是设计为多列索引好;下面从不同角度分析下这个问题;
1.多个单列索引:
定义:即是在表中在需要索引的字段上为每个字段设计一个索引;
特点:简单,索引个数多

2.多列索引:
定义:即是在表中根据查询需求在多个字段上设计一个索引;
特点:稍微复杂,需要考虑索引顺序;

3.性能上的对比

  • 多个单列索引的情况下,MySql在执行查询时,如果where条件中是使用and连接各种过滤条件的,那么MySql会选择其中一个限制最严格的索引(区分度最高的)。
  • 多列联合索引中由于索引是考虑索引字段顺序的,根据InnoDB中B-Tree的实现原理,单个索引限制再严格也没有多列限制严格,所以在多列索引的情况下数据库扫描更少的行,可以在较短的时间内返回数据;

4.判断依据
主要使用MySql的查询计划来判断执行器在查询数据的时候到底使用哪个索引,主要的依据是根据执行计划的Extra字段,下面是Extra在不同情况下代表的使用不同类型的索引
Extra:

  • Using index:直接使用索引,覆盖索引的情况,可以通过索引直接返回所需数据。
  • Using indexc ondition:使用索引,但需要回表查询相关数据

5.覆盖索引
定义:查询所需数据通过索引可以直接获取到,不需要回表查询数据行;

  • Select查询返回列包含在索引列中
  • where条件包含索引列或复合索引的前导列
  • 查询结果的总字段长度可以接受

6.索引合并
在索引设计不太合理的时候,MySql可能会对一些查询执行索引合并

  • 在多个单列索引的情况下,
    • where条件的索引列使用or连接时,会触发索引合并
    • where条件的索引列使用and连接时,通常会选择限制最严格的索引,这个时候联合索引(多列索引)比较合适
  • 合并标识
    • 使用 explain 可看到 type:index_merge
  • 触发索引合并,说明当前索引设计的比较糟糕
相信技术的力量,原创技术文章,感谢您的支持!