在设计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
- 触发索引合并,说明当前索引设计的比较糟糕