索引(数据库重点!!!)

1.介绍

  • 索引(index)是帮助MySQL高效获取数据的数据结构。

2.索引结构

  • B+Tree索引:最常见的索引类型
  • Hash索引:哈希表实现
  • R-tree(空间索引)
  • Full-text(全文索引)

B-Tree(多路平衡查找树)

以一颗最大度数(max-degree)为5(5阶)的b-tree为例(每个节点最多存储4个key,5个指针)

B+Tree

以一颗最大度数为4的b+tree为例

Hash

哈希索引采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中

思考题

为什么InnoDB存储引擎选择使用B+tree索引结构

  • 相对于二叉树,层级更少,搜索效率高
  • 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,导致一页存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加数的高度,导致性能降低
  • 相对Hash索引,B+tree支持范围匹配及排序操作

3.索引分类

在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:

聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引
  • 如果不存在主键,将使用第一个唯一索引作为聚集索引
  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引

思考题

4.索引语法

  • 创建索引
  • 查看索引
  • 删除索引
-- 查看索引
show index from tb_user;
-- name字段为姓名字段,该字段的值可能会重复,为该字段创建索引
create index idx_user_name on tb_user(name);
-- phone手机号字段的值,是非空,且唯一的
create unique index idx_user_phone on tb_user(phone);
-- 为profession、age、status创建联合索引
create index idx_user_pro_age_sta on tb_user(profession,age,status);
-- 为email建立合适的索引来提升查询效率
create index idx_user_email on tb_user(email);
-- 删除索引
drop index idx_user_email on tb_user;

 SQL性能分析

  • SQL执行频率

MySQL客户端连接成功后,通过show[session|global]status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的插入、查询、更新的访问频次:

show global status like 'com_______'; //7个下划线
  • 慢查询日志

记录了所有执行时间超过指定参数的所有SQL语句的日志

MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息

  • profile详情

show profiles能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到当前MySQL是否支持profile操作:

select @@have_profiling;

  • explain执行计划

EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序

语法:直接在select语句之前加上关键字explain/desc

EXPLAIN执行计划各字段含义:

  • id:select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)
  • select_type:表示SELECT的类型,常见的取值SIMPLE(简单表)、PRIMARY(主查询,即外层的查询)、UNION、SUBQUERY
  • type:表示连接类型,性能由好到差的类型为NULL、system、const、eq_ref、ref、range、index、all
  • possible_key:显示可能应用在这张表上的索引,一个或多个
  • Key:实际使用的索引,如果为null,则没有索引
  • Key_len:表示索引中使用的字节数
  • rows:MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值
  • filtered:表示返回结果的行数占需读取行数的百分比,值越大越好

使用规则

  • 验证索引效率

索引失效原则 

  • 最左前缀法则

如果索引了多列,要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将部分失效

  • 范围查询

联合索引中,出现范围查询,范围查询右侧的列索引失效

  • 索引列运算

不要在索引列上进行运算操作,索引将失效

select * from tb_user where substring(phone,10,2) = '21';
  •  字符串不加引号

字符串类型字段使用时,不加引号,索引将失效

  • 模糊查询

如果仅仅是尾部模糊匹配,索引不会失效,如果是头部模糊匹配,则会失效

select * from tb_user where profession like '软件%';
explain select * from tb_user where profession like '软件%';
explain select * from tb_user where profession like '%工程';
  • or连接的条件

用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么设计的索引都不会被用到

  • 数据分布影响

如果MySQL评估使用索引比全表更慢,则不使用索引


  • SQL提示

SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的

use index:建议用哪个索引

ignore index:忽略用哪个索引

force index:强制用哪个索引

explain select * from tb_user use/ignore/force index(idx_user_pro) where profession = '软件工程';
  •  覆盖索引

  • 前缀索引

  • 单列索引与联合索引

单列索引:索引只包含单个列

联合索引:索引包含多个列

在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引

联合索引情况:

  • 索引设计原则

1.数据量较大,且查询频繁的表建立索引

2.针对于常作为查询条件、排序、分组操作的字段建立索引

3.尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高

4.如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引

5.尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率

6.要控制索引的数量

7.如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

双向链表 -- 详细理解和实现

欢迎光顾我的homepage 前言 双向链表是一种带头双向循环的链表。在双向链表中,首先存在着一个头结点;其次每个节点有指向下一个节点的指针next 和指向上一个节点的指针prev &#xff1b…

什么是业务架构、数据架构、应用架构和技术架构

TOGAF(The Open Group Architecture Framework)是一个广泛应用的企业架构框架,旨在帮助组织高效地进行架构设计和管理。而TOGAF的核心就是由我们熟知的四大架构领域组成:业务架构、数据架构、应用架构和技术架构。 所以今天我们就来聊聊,企业…

邮局服务器推荐需要考虑的因素?如何选择?

邮局服务器推荐时如何考量?怎么使用服务器提升效率? 在选择邮局服务器时,有许多重要因素需要考虑。这些因素将直接影响到邮件服务的质量、稳定性和安全性。AokSend将详细探讨选择邮局服务器时需要注意的各个方面。 邮局服务器推荐&#xff…

专属大学生的创作活动,你在CSDN坚持创作,虚竹哥带你成长,带你涨粉

❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。2022年度博客之星评选TOP 10🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作…

x264 编码器 AArch64 汇编函数模块关系分析

x264 编码器 AArch64 汇编介绍 x264 是一个流行的开源视频编码器,它实现了 H.264/MPEG-4 AVC 标准。x264 项目致力于提供一个高性能、高质量的编码器,支持多种平台和架构。对于 AArch64(即 64 位 ARM 架构),x264 编码器利用该架构的特性来优化编码过程。在 x264 编码器中,…

[论文精读]BrainLM: A foundation model for brain activity recordings

论文网址:pdf (openreview.net) 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 省流版 1.1. 心得 1.2…

经验分享:征信查询多了会不会影响大数据综合评分?

很多人在申请贷款的时候,会有一个疑问,就是自己的征信没逾期,就是查询偏多一点,但能达到申贷要求,为什么还会被拒贷?其实就是大数据花了的原因,那征信查询多了会不会影响大数据综合评分呢?接下来本文就为…

从零开始学习嵌入式----Linux系统中shell脚本

目录 Shell脚本入门:玩转功能语句和数组,提升你的效率! 一、功能语句:让你的脚本更灵活 1. 条件语句:if、else、elif 2. 循环语句:for、while 二、数组:处理多项数据的好帮手 1. 声明数组…

【CSS in Depth 2精译】2.5 无单位的数值与行高

当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高 ✔️2.6 自定义属性2.7 本章小结 2.5 无单位的数值与行高 有些属性允许使用无单位的数值(unitless value…

《信息技术时代》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问:《信息技术时代》是不是核心期刊? 答:不是,是万方维普收录的正规学术期刊。 问:《信息技术时代》级别? 答:省级。主管单位:深圳湾科技发展有限公司 主办单位&am…

【Pytorch实用教程】transformer中创建嵌入层的模块nn.Embedding的用法

文章目录 1. nn.Embedding的简单介绍1.1 基本用法1.2 示例代码1.3 注意事项2. 通俗的理解num_embeddings和embedding_dim2.1 num_embeddings2.2 embedding_dim2.3 使用场景举例结合示例1. nn.Embedding的简单介绍 nn.Embedding 是 PyTorch 中的一个模块,用于创建一个嵌入层。…

cdr捕捉点怎么设置---模大狮模型网

在 CorelDRAW 中,捕捉点(Snap Points)是一种非常有用的功能,它可以帮助你在绘制和编辑图形时对齐、定位和调整对象。以下是关于如何设置捕捉点的简要步骤: 打开和设置捕捉点: 打开捕捉点控制器: 在 CorelDRAW 的顶部菜…

AI算力发展现状与趋势分析

综合算力发展现状与趋势分析 在数字经济的疾速推动下,综合算力作为驱动各类应用和服务的新型生产力,其价值日益凸显。我们深入探讨了综合算力的定义、重要性以及当前发展状况;并从算力形态、运力性能和存储技术等角度,预见了其发展…

斐讯N1盒子刷入Armbian并安装Docker拉取网络下行流量教程

一直在跑PCDN,目前主推八米云跟点心云,八米单价比点心更高,业务都一样,直播业务。 两种刷机教程我也发下。 八米云:点此跳转 点心云:点此跳转 最近各运营商对PCDN打击力度加大,需求拉取下行流量…

活动策划秘籍:如何让企业活动引爆市场?

作为一个活动策划,我的经验是,活动策划是一场精心编排的交响乐,每一个音符都要恰到好处。 想要做好企业活动策划工作的关键在于综合考虑多个方面,并确保每个环节的顺畅执行。 以下是7个关键要素,只要用心体会&#x…

【C++】类中的六个默认成员函数(构造函数、析构函数、拷贝构造函数、复制重载函数等)

类中的六个默认成员函数 默认成员函数为了解决C语言存在的一些问题而诞生,默认存在于类中,进行某种操作时会自动调用默认成员函数,如想在此种操作中自动实现某种操作,可以手动定义此默认成员函数,如果手动定义则取代默…

强化学习驱动的狼人游戏语言智能体战略玩法

Language Agents with Reinforcement Learning for Strategic Play in the Werewolf Game 论文地址: https://arxiv.org/abs/2310.18940https://arxiv.org/abs/2310.18940 1.概述 在AI领域,构建具备逻辑推理、战略决策以及人类沟通能力的智能体一直被视为长远追求。大规模语…

Echarts 取消或改变鼠标移上效果

文章目录 问题分析解决补充:去掉鼠标移上去变小手问题 鼠标移动前 鼠标移动后 分析 鼠标一移上去老闪(显示浮框信息和图变大了) 解决 hoverAnimation:false即可解决 series: [{hoverAnimation:false,name:

从微分方程组构建 bbr 模型

描述分析 bbr 的文字自 2016 年底起至今从空白到泛滥,我自己在期间贡献了不少,本文又是一篇,但不同的是,本文尝试用闭环的数学模型给出一个 bbr 的全貌,顺便和 aimd 做对比。 先看带宽特性 bw(t),设瓶颈带…

力扣 hot100 -- 动态规划(下)

目录 💻最长递增子序列 AC 动态规划 AC 动态规划(贪心) 二分 🏠乘积最大子数组 AC 动规 AC 用 0 分割 🐬分割等和子集 AC 二维DP AC 一维DP ⚾最长有效括号 AC 栈 哨兵 💻最长递增子序列 300. 最长递增子序列…