单例索引
SELECT uid FROM people WHERE name = ‘xuwuji’ AND gender = ‘M’
- 对name列建立索引,这样就把范围限制在name=‘xuwuji’的结果集上
- 之后再对这个结果集进行扫描 寻找满足gender = ‘M’得到最终结果
- 在MySQL中执行查询时,只能使用一个索引
- 如果我们在name, gender上分别建立索引。执行查询时,MySQL会自动选择一个最严格,也就是获得结果集纪录数最少的索引。(姓名重名的一定比性别重复的少)
联合索引
- 建立一个联合索引(a,b,c),实际相当建了(a), (a, b), (a, b,c)三个索引
- 在创建多列索引时,要根据业务需求,where字句中使用最频繁的一列放在最左边
- B+树是按照从左到右的顺序来建立,当(a,b,c)这样的数据来检索的时候:
- 比较a来确定下一步的搜索方向
- 如果a相同再依次比较b
- 如果b相同再比较c,最后得到检索的数据
最左匹配原则
当使用(b,c)但没有a进行查找时,B+树不知道首先检查哪个节点,因为通过(a、b、c)建立的B+树第一个比较因子永远是a,所以必须要先根据a来搜索才知道下一步去哪里查询。
当使用(a、c)来查找时,B+树首先根据a来查找,但下一个字段b的缺失,所以只能把符合a的数据都找到,然后再从得到的结果集里面扫描,得到能够匹配字段c的数据,也就是意味着(a,c)会使用联合索引,但只有字段a才生效。