在搜索时,由于您当前的条件是calssId和name,MySQL可以通过classId快速定位一批数据。因为这个条件是第一条件MySQL保持B+树(排序根据classId第一),然后是一样的,名字是第二个条件为MySQL保持B+树(按照名称排序),所以即使不添加你的年龄条件,用于索引的索引classId和名称必须是没有问题,但如果你这样查询这是行不通的,因为MySQL将基于您创建一个联合索引。首先是基于classId的查询,然后是基于name的查询,最后是基于age的查询。如果你直接跳过前两个字段,这和全表扫描没有区别,因为MySQL现在不能确认年龄在哪里,只能一个一个地扫描。类似地,如果WHERE条件后面跟着classId=xx,然后是age=xx,在这种情况下,classId可以用于索引,因为B+树维护的第一个字段就是classId。超实用性的Python零基础入门到进阶视频源码淘宝¥2购买已下架但是,age不能用于索引查询,因为不能定位名称,所以此时只能基于符合classId的记录进行完整扫描。这个规则叫做:最左前缀匹配原则;如果你不想理解最左边的匹配原理,让我打个比方,再介绍一次。我们假设classId,name,age,这三个组成的联合索引就像一个三层的建筑,classId是第一层,name是第二层,age是第三层。假设你想达到第三层,你必须从第一层开始,然后是第二层,然后是第三层;你可以只爬到第一级,如果你不爬到剩下的两层也没有关系,这对应于你可以使用classId来做等价查询,如果剩余的字段没有被使用也没有关系;以同样的方式,你可以从第一级爬,然后第二层次,没有攀爬的第三层次,就像你用classId,名称查询,或者你可以从第一级爬到第二个反过来可以爬到第三层从一个水平到另一个,也就是说,你使用classId三个字段的名称,和年龄依次做等价的查询。到目前为止,一切都还好。但如果你不想爬第一个关卡,你想跳过第一个关卡,从第二个关卡开始直接爬,有可能吗?显然,这是不可能的,这意味着在查询时,跳过classId,直接查询名称,这样就根本无法使用索引。调整名称后查询年龄也一样,直接跳过第一层和第二层,从第三层开始,也就是说,调整classId和name后不能直接使用索引查询年龄。现在你应该完全理解最左边匹配的原理了,对吧?以下原则中最基本的条件是需要满足:最左前缀匹配原则。范围查找规则范围搜索规则,我相信这也是最常用的原则,比如下面的SQL持续
转载请注明:http://www.aierlanlan.com/rzdk/6027.html