案例:

top one: 所以不合适,使用最左匹配原则。
top three: 值是唯一的,但是没有索引。
解决后:

总结:

最左匹配:


理解为啥会有最左匹配原则:

a字段是有序的:1,1,2,3,4
b: 1,2,2,5,1
会先对a字段排序,然后再对b字段排序,那么单纯的: b=2进行查询,是没办法用到索引的。
理解最左匹配:假如有(a,b) 这么一个联合索引的话,查询语句一定要有a字段,否则会进行全表扫描 (但是8.0中有索引跳跃扫描走了索引,但是如果a字段很多,那效率就很低了!!!)。

通过递归生成测试数据

col1和col2都有,则说明用到了索引,并且key_len为10

只有字段col1也可以走索引, key_len为5

只有col2,则没有走索引,走了全表扫描!!!

理解原因:也就是先按照col1排序,但是col2的话,是没有关联的,只能全表扫描


可以看出col1是等值, col2是范围 那也可以用到索引,因为:先找到col1的,col2的往后找就行。

改为 > 100时,没有走!!! 因为绝大多数可能都大于100,所以没走,所以走索引再回表还是直接全表扫描呢?

大一点就走了,说明: 大宇1W的,可能也就10条,优化器认为:走索引好。

左边是确定的,则走了索引。

右边是确定的,则不走。
也就是:遵循最左索引的规则上,减少索引数量。
也就是(col1, col2) + (col2) 这样子建2个索引。