crossoverJie / crossoverJie/JCSprout

SQL优化-最左匹配原则疑问

Open
#162 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
26.8k
Forks
7k
PR merge metrics
No merged PRs in 30d

Description

https://github.com/crossoverJie/JCSprout/blob/master/MD/SQL-optimization.md
在上面这个地址中,针对SQL优化的专题,其中针对“最左匹配原则”的介绍,有点歧义,我在这里给订正一下,你看一下是否合适?

**问题描述:**

> 如果给 user 表中的 username pwd 字段创建了复合索引那么使用以下SQL 都是可以命中索引:
>
> select username from user where username='zhangsan' and pwd ='axsedf1sd'
>
> select username from user where pwd ='axsedf1sd' and username='zhangsan'
>
> select username from user where username='zhangsan'
> 但是使用
>
> **select username from user where pwd ='axsedf1sd'
> 是不能命中索引的。**

**此处,如果单独使用pwd字段,是可以用到索引的。**

讲上面问题之前,我先补充一些知识,因为我觉得你对索引理解是狭隘的:
上述你的pwd条件查询的explain结果中显示用到索引的情况类型是不一样的。,可观察explain结果中的type字段。你的查询是:
1. type: index

**解释:** index:这种类型表示是mysql会对整个该索引进行扫描。要想用到这种类型的索引,对这个索引并无特别要求,只要是索引,或者某个复合索引的一部分,mysql都可能会采用index类型的方式扫描。但是呢,缺点是效率不高,mysql会从索引中的第一个数据一个个的查找到最后一个数据,直到找到符合判断条件的某个索引。

**所以**,对于你的第一条语句:
EXPLAIN select username from user where pwd ='axsedf1sd';

判断条件是pwd ='axsedf1sd',而pwd是(user_name, pwd)复合索引的一部分,没有问题,可以进行index类型的索引扫描方式。explain显示结果使用到了索引,是index类型的方式。

**准确一点说,是没有完全用到复合索引,但是会使用一部分,所以也是走索引的。**

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.