1、单一索引和复合索引

单一索引是指索引列为一列的情况,另外,用户可以在多个列上建立索引,这种索引叫做复合索引,也叫组合索引。

复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引。

2、建立复合索引

创建索引:
create index idx1 on table1(col1,col2,col3)

查询(使用索引):
select * from table1 where col1= A and col2= B and col3 = C
这时候查询优化器,不在扫描全表,而是利用索引查询。

3、复合索引的使用注意事项:索引最左匹配原则

对于复合索引,在查询使用时,最好将条件顺序按找索引的顺序,这样效率最高,例如:select * from table1 where col1=A AND col2=B AND col3=D。如果使用 where col2=B AND col1=A 或者 where col2=B 将不会使用索引。

1.png

2.png

mysql创建复合索引的规则是首先会对复合索引的最左边的,也就是第一个name字段的数据进行排序,在第一个字段的排序基础上,然后再对后面第二个的age字段进行排序。
其实就相当于实现了类似 order by name age这样一种排序规则。
所以:第一个name字段是绝对有序的,而第二字段就是无序的了。所以通常情况下,直接使用第二个age字段进行条件判断是用不到索引的, 这就是所谓的mysql为什么要强调最左前缀原则的原因。

3.png

那么什么时候才能用到age字段的索引呢? 前提当然是age字段的索引数据也是有序的情况下才能使用咯,什么时候才是有序的呢?观察可知,是在name字段是等值匹配的情况下,age才是有序的。
这也就是mysql索引规则中要求复合索引要想使用第二个索引,必须先使用第一个索引的原因,而且第一个索引必须是等值匹配。

标签: none

入群须知:

凡是加入我群者,皆要严守群规,每周六、日是群规反思日。群规的要义有三点∶

(1)坚持系统化的学习方式,由量变到质变。仅仅解决工作中的问题,并不叫系统化的学习。

(2)坚持以价值为导向的学习方式,扔掉低价值知识[配置、调参、安装],聚焦高价值知识[结构、算法、优化],推动量变到质变的进程。

已有 2 条评论

  1. Tim_Xue Tim_Xue

    "where col2=B AND col1=A"这里还是会用到索引的最左匹配的吧,它会被编译器调整顺序的

    1. 你说的很对。这个问题早就发现了,之所以没有做修订,是因为不想挖的太深,否则不利于初学者对最左匹配的感性认知。

添加新评论