# 最左前缀有手就会，那索引下推呢？

[En]

The leftmost prefix principle of the joint index belongs to the high-frequency interview questions, which most students must know, but what happens to those parts that do not meet the leftmost prefix (index push down)

[En]

Index push down is not a high-frequency problem, there should not be many students who know it (but that doesn’t mean it’s difficult, it’s easy). Learn to pack a wave cup.

## 引子

select name from user where id_card = xxx;


[En]

However, the maintenance of index fields always comes at a cost. If you design a federated index for each query, is there too many indexes? Conversely, * is it a bit wasteful to create a federated index for a single infrequent request * . So we need to make some tradeoffs when building * redundant indexes * to support overlay indexes.

[En]

Specifically, what should we do?

## 最左前缀原则

B+ 树这种索引结构，可以利用联合索引的 “最左前缀” 来定位记录。

[En]

What is the leftmost prefix principle of federated indexes?

📌 这里 ” 键值都是排好序” 的这种说法可能会让大伙很疑惑，似乎只有 a 列是排序的，b 列并没有排序啊。

[En]

Be careful! The sort here means that the first key is determined, and for records with the same key, the result of the query is the sorting of the second key.

• SELECT ... FROM TABLE WHERE a=xxx ORDER BY b
• SELECT ... FROM TABLE WHERE a=xxx AND b=xxx ORDER BY c

• SELECT ... FROM TABLE WHERE a=xxx ORDER BY c

[En]

Having said so much, it seems to have nothing to do with the leftmost prefix.

select * from table where a = XXX and b= XXX;


select * from table where a = XXX;


select * from table where b = XXX;


This，就是联合索引的最左前缀原则， 只要查询的是联合索引的最左 N 个字段，就可以利用该联合索引来加速查询

[En]

Based on the description of the leftmost prefix index above and the example of the user table, let’s discuss a question: * how to arrange the order of fields in the index when establishing a federated index?*

[En]

For example, there are three high-frequency query requirements:

• 根据 name 查询 id： select id from user where name = xxx;
• 根据 age 查询 id： select id from user where age= xxx;
• 根据 name 和 age 查询 id： select id from user where name = xxx and age = xxx;

[En]

At this point, we have two options for indexing:

1. 联合索引 (age, name) + 单字段索引 (name)
2. 联合索引 (name, age) + 单字段索引 (age)

[En]

In this scenario, the principle we need to consider is * space * .

## 索引下推

[En]

The leftmost prefix can be used to locate records in the index, so what about those parts that do not match the leftmost prefix?

select * from tuser where name like '张%' and age = 20 and sex = male


《高性能 MySQL》 书中提到： 对于联合索引，如果查询中有某个列的范围查询，则其右边所有列都无法使用索引进行快速定位

🥸 面试官：讲一下联合索引的最左前缀原则，为什么得最左匹配，不按照这个来为什么失效？
😎 小牛肉：最左前缀原则就是只要查询的是联合索引的最左 N 个字段，就可以利用该联合索引来加速查询。

## 大厂面试火箭计划

[En]

At present, most of the answers to the interview questions provided on the Internet are just a few lines, and there is no logic. The interviewer knows it is memorized as soon as he hears it. I don’t think this can meet the demands of most of the students.

[En]

How to let the interviewer know that I am not a recite? How to know what it is and why?

So，我希望的是以面试题为导向，建立完整的知识体系，让八股文变得有价值，而不是东一锤西一棒

[En]

The follow-up preparation is guided by the noodle scripture posts on Niu Ke, providing a colloquial recitation version + a more professional detailed explanation version for each interview question. Students who already know, uh, can read the recitation version directly, and those who don’t know much about it can read it together with the detailed explanation version.

[En]

All the interview questions have been sorted according to the order of the knowledge system, and I will add some supplementary questions for improvement.

Original: https://www.cnblogs.com/cswiki/p/15701065.html
Author: 飞天小牛肉
Title: 最左前缀有手就会，那索引下推呢？

(0)

### 大家都在看

• #### js异步编程终级解决方案 async/await

在最新的ES7（ES2017）中提出的前端异步特性：async、await。 async、await是什么 async顾名思义是”异步”的意思，async用…

数据库 2023年6月9日
0180
• #### 数组

1. 数组概述 数组(array): 存储一个元素个数固定且元素类型相同的有序集 2. 数组的定义格式 格式一 数据类型[] 变量名 int[] array; –>推荐 格…

数据库 2023年6月14日
0142
• #### 初入Android——基础控件学习

Android开发离不开控件，这篇随笔就是我自己用来记录学习Android控件知识的！！！ 一、TextView TextView是Android UI 控件（文本框控件） 基础属…

数据库 2023年6月11日
0143
• #### Spring常见问题

Spring常见问题 问渠那得清如许？为有源头活水来。 Spring 是个 java 企业级应用的开源开发框架。Spring 主要用来开发 Java 应用，但是有些扩展是针对构建 …

数据库 2023年6月14日
0135
• #### 2022-8-26 jq简单了解

Query 是一个 JavaScript 函数库。 jQuery 是一个轻量级的”写的少，做的多”的 JavaScript 库。jQuery 库包含以下功能…

数据库 2023年6月14日
0185
• #### Vmware 虚拟机连接外网和设置固定IP

NAT 模式（地址转换模式） 在NAT模式中，主机网卡直接与虚拟NAT设备相连，然后虚拟NAT设备与虚拟DHCP服务器一起连接在虚拟交换机VMnet8上，虚拟机借助NAT功能，通过…

数据库 2023年6月14日
0187
• #### 粗粒度服务的执行时间统计算法实现及问题推广

3.1 算法一：逐一合并算法 3.1.1 算法描述 如图3.我们先将所有的时间片段按照起始时刻排序，后面的处理过程即依次判定相邻两个时间片段的三种关系，并将统计时间进行合并，合并的…

数据库 2023年6月14日
0175
• #### Redis缓存穿透 缓存击穿 解析

先解析一下Redis中什么叫做 缓存穿透 和 缓存击穿： 缓存穿透：首先我们要明确概念，缓存穿透是 在查询数据时 查询的数据在 redis 和 DB中都没有的 叫做缓穿透，解决方案…

数据库 2023年6月9日
0166
• #### 手把手教你分析MySQL查询性能瓶颈，包教包会

当一条SQL执行较慢，需要分析性能瓶颈，到底慢在哪？ 我们一般会使用 Explain查看其执行计划，从执行计划中得知这条SQL有没有使用索引？使用了哪个索引？ 但执行计划显示内容不…

数据库 2023年5月24日
0149
• #### JDBC概述

JDBC概述 JDBC（Java DataBase Connectivity），它是一种用于执行 SQL语句的 JavaAPI。通过使用JDBC就可以使用 相同的API访问 不同的…

数据库 2023年6月16日
0135
• #### 打破千篇一律，DIY属于自己独一无二的商城

随着线上购物成为了人们的主要消费之一，搭建商城系统也成为一大热门的发展方向，在现在的电商市场中，经营的主体规模非常庞大，各种各样的电商系统琳琅满目，但是只要仔细观察就会发现，有很大…

数据库 2023年6月14日
0177
• #### Centos7下Oracle启动命令

1、查询挂载历史记录 在root账户下使用一下命令 查看历史使用挂载的那个磁盘 &#x67E5;&#x770B;&#x6302;&#x8F7D;&a…

数据库 2023年6月16日
0161
• #### python-django框架中使用FastDFS分布式文件系统

一、安装FastDFS 1-1：执行docker命令安装 bash;gutter:true; 安装tracker docker run -dti –network=host –…

数据库 2023年6月6日
0170
• #### Java面向对象程序设计（2）封装，继承和多态

面向对象的三大特征是：封装，继承和多态 访问修饰符 java 提供四种访问控制修饰符号，用于控制方法和属性(成员变量)的访问权限（范围） ： 访问级别 访问控制修饰符 同类 同包 …

数据库 2023年6月16日
0149
• #### 配置Django实现数据库读写分离

配置Django实现数据库读写分离 django在进行数据库操作的时候，读取数据与写数据（增、删、改）可以分别从不同的数据库进行操作。 1. 在配置文件中增加slave数据库的配置…

数据库 2023年6月14日
0168
• #### 阿里云服务器中MySQL数据库被攻击

前几天刚领了一个月的阿里云服务器玩，在里面装了MySQL，然后这几天找了个小项目练习着玩呢，就将表建在里面了。刚访问添加员工还好好的，刚给员工分页查询呢 ，啪一下 ，很突然昂 ，就…

数据库 2023年6月11日
0176