Mysql B+树索引

news2025/1/17 22:05:44

一、联合索引

内节点中存储的是 目录项 记录 ,叶子节点中存储的是 用户记录 (由于不是聚簇索引,所以用户记录是不完整的,缺少 country 列的 值)。这个 idx_name_birthday_phone_number 索引对应的 B+ 树中页面和记录的排序方式就是 这样的: 
先按照 name 列的值进行排序。 
如果 name 列的值相同,则按照 birthday 列的值进行排序。 
如果 birthday 列的值也相同,则按照 phone_number 的值进行排序。 

二、索引匹配原则

2.1 最左匹配原则

我们想使用联合索引中尽可能多的列,搜索条件中的各个列必须是联合索引中从最左边连续的列。

2.2 匹配范围查询

2.2.1 示例

如果对多个列同时进行范围查找的话,只有对索引最左边的那个 列进行范围查找的时候才能用到 B+ 树索引,比如:
SELECT * FROM person_info WHERE name > 'Asa' AND name < 'Barlow' AND birthday > '1980-01-0 1';查询分成两部分:
1. 通过条件 name > 'Asa' AND name < 'Barlow' 来对 name 进行范围,查找的结果可能有多条 name 值不同的 记录。
2. 对这些 name 值不同的记录继续通过 birthday > '1980-01-01' 条件继续过滤。

只能用到 name 列的部分,而用不到 birthday 列 的部分,因为只有 name 值相同的情况下才能用 birthday 列的值进行排序,而这个查询中通过 name 进行范围查 找的记录中可能并不是按照birthday 列进行排序的,在搜索条件中继续以 birthday 列进行查找时是用不到 这个 B+ 树索引的。

2.2.2 示例:精确匹配某一列并范围匹配另外一列

SELECT * FROM person_info WHERE name = 'Ashburn' AND birthday > '1980-01-01' AND birthday < '2000-12-31' AND phone_number > '15100000000';
这个查询的条件可以分为3个部分:
1. name = 'Ashburn' 对 name 列进行精确查找,当然可以使用 B+ 树索引了。 
2. birthday > '1980-01-01' AND birthday < '2000-12-31' ,由于name 列是精确查找,所以通过 name = 'Ashburn' 条件查找后得到的结果的 name 值都是相同的,它们会再按照 birthday 的值进行排序。所以此时 对 birthday 列进行范围查找是可以用到 B+ 树索引。 
3. phone_number > '15100000000' ,通过 birthday 的范围查找的记录的 birthday 的值可能不同,所以这个条件无法再利用 B+ 树索引了只能遍历上一步查询得到的记录。
4. 同理,下边的查询也是可能用到这个 idx_name_birthday_phone_number 联合索引的: SELECT * FROM person_info WHERE name = 'Ashburn' AND birthday = '1980-01-01' AND AND phone _number > '15100000000';

三 order 排序与分组

3.1 能使用到索引

按照最左匹配原则,也能使用到索引

3.2 不能使用到索引

1、ASC、DESC混用
2、WHERE子句中出现非排序使用到的索引列
3、排序列包含非同一个索引的列
4、排序列使用了复杂的表达式

3.3 group by 分组 :需要满足最左匹配原则

SELECT name, birthday, phone_number, COUNT(*) FROM person_info GROUP BY name, birthday, ph one_number;
1. 先把记录按照 name 值进行分组,所有 name 值相同的记录划分为一组。
2. 将每个 name 值相同的分组里的记录再按照 birthday 的值进行分组,将 birthday 值相同的记录放到一个小 分组里,所以看起来就像在一个大分组里又化分了好多小分组。 
3. 再将上一步中产生的小分组按照 phone_number 的值分成更小的分组,所以整体上看起来就像是先把记录分 成一个大分组,然后把 大分组 分成若干个 小分组 ,然后把若干个 小分组 再细分成更多的 小小分组 。

四 如何建立索引

1、只为用于搜索、排序或分组的列创建索引
2、考虑列的基数

        列的值种类越多越适合建立索引
3、索引列的类型尽量小

    数据类型越小,在查询时进行的比较操作越快(这是CPU层次的东东)
    数据类型越小,索引占用的存储空间就越少,在一个数据页内就可以放下更多的记录,从而减少磁盘 I/O 带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中,从而加快读写效率。
4、索引字符串值的前缀
5、让索引列在比较表达式中单独出现
6、主键插入顺序
7、冗余和重复索引

五 总结

1. B+ 树索引在空间和时间上都有代价,所以没事儿别瞎建索引。
2. B+ 树索引适用于下边这些情况:
    全值匹配
    匹配左边的列
    匹配范围值
    精确匹配某一列并范围匹配另外一列
    用于排序
    用于分组
3. 在使用索引时需要注意下边这些事项:
    只为用于搜索、排序或分组的列创建索引
    为列的基数大的列创建索引
    索引列的类型尽量小
    可以只对字符串值的前缀建立索引
    只有索引列在比较表达式中单独出现才可以适用索引
    为了尽可能少的让 聚簇索引 发生页面分裂和记录移位的情况,让主键AUTO_INCREMENT。
    定位并删除表中的重复和冗余索引
    尽量使用 覆盖索引 进行查询,避免 回表 带来的性能损耗。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/944111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apifox下载安装步骤

我们先访问网址 https://apifox.com/?utm_sourcebaidu&utm_mediumsem&utm_campaign251430236&utm_content7810722111&utm_termapifox%E6%9F%A5%E7%9C%8B%E7%89%88%E6%9C%AC&bd_vid8323327349775096324 然后 这里这个免费下载已经写的这么明显了 那就直接点…

UVM知识点3

Vim 中如何去掉 ^M 字符&#xff1f; 基于 DOS/Windows 的文本文件在每一行末尾有一个 CR&#xff08;回车&#xff09;和 LF&#xff08;换行&#xff09;&#xff0c;而 UNIX 文本只有一个换行,即win每行结尾为\r\n&#xff0c;而linux只有一个\n如果win下的文档上传到linux…

时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比

时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比效果一览基本描述程序设计参考资料 效果一览 基本描述 MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比。 1.Matlab实现PSO-BiLSTM和BiLSTM…

无涯教程-Android - Activity

Activity代表具有用户界面的单个屏幕&#xff0c;就像Java的窗口或框架一样。Android Activity 是ContextThemeWrapper类的子类。 如果您使用过C&#xff0c;C或Java编程语言&#xff0c;那么您一定已经看到您的程序从 main()函数开始。与之非常相似&#xff0c;Android系统以 …

五、多表查询-4.3子查询-列子查询

一、概述 子查询返回的结果是一列&#xff08;可以是多行&#xff09;&#xff0c;这种子查询称为列子查询。 常用的操作符&#xff1a;in、not in、any、some、all 二、演示 【例1】查询“销售部”和“市场部”的所有员工信息 1、查询销售部和市场部的部门ID 返回的结果是…

highcharts 修改 箱线图每个箱子的颜色

在js中添加以下代码 plotOptions: {series: {colorByPoint: true},boxplot: {fillColor:null,colorBorPoint:true,colors: [red,#000000]),}}, 综合网上多方材料&#xff0c;得出

Linux之超强16进制命令:xxd(三十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

基于ssm+vue汽车售票网站源码和论文

基于ssmvue汽车售票网站源码和论文088 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让…

英文科技论文写作与发表-论文结构(第1章)

第1章 论文结构 不同科技领域论文的组织结构不尽相同。 各专业领域专家公认的一个要点是&#xff1a;论文的前一页半到两页最为重要&#xff0c;决定了读者是否愿意继续读下去&#xff0c;也是审稿人得出初步结论的依据。 着手之前&#xff0c;先组织论文结构&#xff0c;把…

基于web的仓库管理系统jsp商品进销存java源代码Mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于web的仓库管理系统 系统有2权限&#xff1a;管理…

软件测试面试题有什么经常被问到的?

软件测试面试&#xff0c;常问的问题如下&#xff1a; 1、自我介绍 2、公司的测试流程 3、测试用例设计方法的区别及应用场景 4、测试计划怎么写&#xff0c;包含哪些内容&#xff1f;和测试方案的区别是什么&#xff1f; 5、bug的处理机制和bug的定级 6、敏捷测试下的工作流程…

【漏洞复现】瑞友应用虚拟化系统 SQL注入

漏洞描述 瑞友天翼应用虚拟化系统&#xff08;GWT System&#xff09;是国内具有自主知识产权的应用虚拟化平台&#xff0c;是基于服务器计算&#xff08;Server-based Computing&#xff09;的应用虚拟化平台。瑞友天翼应用虚拟化系统存在SQL注入漏洞。 免责声明 技术文章…

谁能笑傲江湖:聊聊8月份中国数据库排行榜与国产数据库选型

引言 天下风云出我辈&#xff0c;一入江湖岁月催。 有人说&#xff0c;有数据库的地方&#xff0c;就有“江湖”。 曾经多少前辈满腔热血投入国产数据库事业中&#xff0c;悠悠数十载&#xff0c;又如白驹过隙&#xff0c;最终不知几家欢喜几家愁。 截止2023年8月份&#xf…

Spring 事务是什么 ?事务的传播机制?

目录 1. 什么是事务&#xff1f; 1. Spring 事务三大基础设施 1.1 PlatformTransactionManager 平台事务管理器 1.2 TransactionDefinition 事务属性定义 1.3 TransactionStatus 事务状态 3. Transaction 注解 4. Spring 事务角色 5. Transaction 注解属性 5.1 事务的回…

WebGPU加载Wavefront .OBJ模型文件

在开发布料模拟之前&#xff0c;我想使用 WebGPU 开发强大的代码基础。 这就是为什么我想从 Wavefront .OBJ 文件加载器开始渲染 3D 模型。 这样&#xff0c;我们可以快速渲染 3D 模型&#xff0c;并构建一个简单而强大的渲染引擎来完成此任务。 一旦我们有了扎实的基础&#x…

山西电力市场日前价格预测【2023-08-30】

日前价格预测 预测明日&#xff08;2023-08-30&#xff09;山西电力市场全天平均日前电价为317.95元/MWh。其中&#xff0c;最高日前电价为373.07元/MWh&#xff0c;预计出现在19: 45。最低日前电价为248.17元/MWh&#xff0c;预计出现在13: 30。 价差方向预测 1&#xff1a; 实…

手机云控设计思路

本系统为任务分发系统,上游发布任务或者接受其他平台系统分发的任务,对任务进行规则引擎处理后分类,由核心分发系统部分进行对存活的空闲终端进行分发任务,终端做完任务后进行反馈给任务系统. 核心要处理的点是终端存活与空闲的统计、任务平均分布下发给终端的算法,保证分布的…

RK3562 VS A40i 性能对比

RK3562作为瑞芯微新推出的低功耗、高性价比的通用SOC&#xff0c;在智能商显和工业控制领域又为深圳触觉智能增加了一款强有力的高性价比产品。RK3562是一款专为智能显示设备设计的高性能、低功耗四核应用处理器&#xff0c;其工规版本RK3562J还具备CAN FD接口&#xff0c;工作…

基于SSM的旅游管理系统jsp房源信息java源代码Mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于SSM的旅游管理系统 系统有2权限&#xff1a;管理…