MYSQL 精通索引【快速理解】

目录

1、什么是索引?

2、索引结构

        1.为什么不使用二叉树呢?

        2.B树数据结果

       3.B+树

        4.Hash结构

3、索引语法

        1.创建索引

        2.查看索引

        3.删除索引

4、SQL性能分析

       1.SQL执行频次

        2.慢查询日志

        3.profile详情

        4.EXPLAIN

5、索引规则

        1.最左前缀法则

        2.索引失效情况

        3.SQL提示

        4.索引覆盖&回表查询

        5.前缀索引

        6.单列索引&联合索引

        6、索引设计原则


1、什么是索引?

        索引是一种可以快速查询的有序的数据结构。如果查询没用上索引的话,那么就会出现把表中的每一条数据进行扫描,这样效率太差。

        索引的优点就是查找速度快,并且减少进行IO请求次数,根据索引排序减少与CPU消耗。但是存储索引要空间进行存储,并且增删改的时候效率较低因为要在数据结构上修改节点。

        索引一般是一级索引也叫聚集索引,非聚集索引就是以非主键作为索引生成的索引,一般主键就是聚集索引,没有主键会把第一个非空索引当做聚集索引,如果都没有会生成一个隐藏的rowId作为聚集索引。

2、索引结构

        B+树索引 大部分引擎都支持的数据结构、Hash索引,R-tree索引、Full-Text索引

        目前使用InnoDB树结构那么就主要介绍B+树结构

        1.为什么不使用二叉树呢?

        因为二叉树可能会有链化问题,比如二叉排序树,链化斜树,这样查找层树过多导致查找效率太慢,红黑树保证不会倾斜,但是数据的存储的值每个节点只能存两个,对于存储多个数据,也会导致层次太高查找性能不足。

        2.B树数据结果

   

        5阶数说明有5个子节点,有4个key 5个指针。

       3.B+树

        它的特点是所有数据都会出现在叶子节点,如果数据满的话键值会从中间向上分裂,并且叶子节点会有一根单向链表进行连接。在Mysql中优化了一个点就是多了一个指针形成双向链表在叶子节点,保持查找的顺序,提供区间访问性能。

 目前我们用的是B+树,为什么?因为如果根据B+树的话,非叶子节点存储的就是指针而不是值,因为一个取最多能存1M大小的内容,然后一个页最多存16k的内容,也就是一个区最多能存64页,我们设想如果节点上存键值指针以及数据,那么一个区能存的指针键值就少,那么我树的高度就会变高层级变大,如果是B+树,非叶子节点只存储键值和指针,那么同样空间能存储的键值就多,树的层级变小,查找效率变高。比如这个数是5阶那么可能单数据太大,B树节点可能4个数据加指针加键值就存满了。

        4.Hash结构

确定是不能范围查询、不支持排序功能,好处是块,因为存储的时候会生成一个对应的hash值,对应着该数据的位置,如果查找的时候根据键值通过hash算法就可以找到对应hash值位置的数据 Memory引擎支持该结构。

3、索引语法

        1.创建索引

                CREATE [UNIQUE|FULLTEXT] INDEX index_name on table_name(index_col_name)

        2.查看索引

                SHOW INDEX FROM table_name;

        3.删除索引

                DROP INDEX index_name ON table_name;

4、SQL性能分析

       1.SQL执行频次

                 show global status like 'Com______';

                当前数据库的增删改查的次数的频率

        2.慢查询日志

                查看慢查询日志开关

                show variables like 'slow_query_log';

                在/etc/my.cnf中

                日志存在/var/lib/mysql下如果超过2秒的查询就会存的该日志里

        3.profile详情

                select @@have_profiling; 查询是否支持profile操作

                SETprofiling=1;开启

                通过SHOW profiles;就看到查询的语句对应的耗时时间。

        4.EXPLAIN

                可以看到SQL执行计划,能看到查询语句,可以看到表的查询的连接顺序,还能看到使用的索引。

                EXPLAIN SELECT 字段列表 FROM 表名 WHERE条件 ,意思就是任意查询前加一个EXPLAIN就可以了。

        

                根据查询结果,id值相同的话是执行顺讯是从上到下,id值不同的执行顺序是id值越大越先执行。

5、索引规则

        1.最左前缀法则

                如果使用了联合索引,那么查询条件使用索引是从最左侧那个索引必须使用,并且不能跳过中间列,如果跳过了那么后面的索引失效也就是当初设置索引的顺序是ABC,可以是AB因为中间没有跳过 。与写的时候的位置无关 ,也就是当初设置索引的顺序是ABC,写的时候只有有ABC就可以无需关系是ABC BCA ACB。 但是如果使用了 > <的查询操作则范围查询右侧索引失效。

        2.索引失效情况

                1.如果对索引进行运算操作,则该索引失效。

                2.字符串类型字段查询要加单引号 否则索引失效

                3.模糊查询的时候,如果头部使用了%模糊匹配,索引失效,如果尾部使用则不会。

                4.用or关键字的时候如果有一侧没有使用索引则索引失效。

                5.优化器如果发现走索引比不走索引还要慢则不用索引,比如本来就需要全表扫描,使用了索引还要走全表扫描性能会差一点。还有就是查询的结果占大部分,那么mysql会认为扫描全表还是快,但是查询如果是占一小小部分则还是会使用索引的。

        3.SQL提示

                某些情况下,对于某个字段,它可能是联合索引,也是单列索引,可以在查询的时候指定使用的是哪种索引,加上use index(索引名)就可以了,当然mysql也有可能不接受这个建议。

也可以用ignore use index(索引名)建议忽略某个索引。

                强制使用force index(索引名)

        4.索引覆盖&回表查询

                二级索引就是叶子节点除了id还有对应的设置的非主键索引

                聚集索引就是叶子节点存储着全部数据

        第一条SQL就是直接按照右侧第一个树(聚集索引)进行搜索,拿到row整行数据,因为是根据主键搜索的。

        第二条SQL是根据第二个树(二级索引)进行搜索的,二级索引叶子节点存储的id和对应的索引值,这样能直接拿到需要的值而不需要再聚集索引中再次查询的就叫索引覆盖

        第三天SQL不像前两条SQL能一次查找直接得出结果,而是要出现先进行聚集索引查找,查找到的数据只有一部分,所以需要回表查询在聚集索引的树中把所有数据查找出来。

        5.前缀索引

                索引由于作为叶子节点中存储的数据,需要占用存储空间,如果对于数据量特别大的数据,并且索引对应列的存储值也比较大的可以用前缀索引,它是指将该数据的的前几位作为索引,这样可以减少索引的存储空间。语法是下面这样。

实际上它是一种时间换空间的方法,因为他是根据前部分的某一段索引再二级索引中查找数据,找到了再去聚集索引中查找数据,找到了还得对比是不是最初的数据因为当初传进来的只是数据的部分值。

        6.单列索引&联合索引

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

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

        使用联合索引会减少回表查询 

如果它的键(索引)包含了所需要的查询结果,那么就直接取就可以覆盖索引了,不需要回表查询了。

        6、索引设计原则

                对于查询频繁>100W,在where、group by、order by 后的条件建立索引,对于字符串长的可以用前缀索引,尽量使用联合索引减少单列索引,查询时可以使用索引覆盖。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Framework系列】UnityEditor调用外部程序详解

需求介绍 之前Framework系列有介绍过导表配置工具&#xff0c;感兴趣的小伙伴可以看一看之前的文章《【Framework系列】Excel转Json&#xff0c;配置表、导表工具介绍》。由于导表工具和Unity是两个工程&#xff0c;导表工具不在Unity工程之内&#xff0c;所以在配置生成完成之…

Docker+Django项目部署-从Linux+Windows实战

一、概述 1. 什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;支持在win、mac、Linux系统上进行安装。可以帮助我们在一台电脑上创建出多个隔离的环境&#xff0c;比传统的虚拟机极大的节省资源 。 为什么要创建隔离的环境&#xff1f; 假设你先在有一个centos7.…

[GXYCTF2019]BabyUpload--详细解析

信息搜集 进入界面&#xff0c;直接就是文件上传界面&#xff0c;结合题目&#xff0c;得知考察的是文件上传漏洞。 思路 文件上传漏洞&#xff0c;第一步先看有没有前端校验&#xff1a; 没有前端校验。 我们写一个一句话木马文件&#xff1a; //shell.php GIF89a <…

北京大学c++程序设计听课笔记101

基本概念 程序运行期间&#xff0c;每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址&#xff08;也称“入口地址”&#xff09;。我们可以将函数的入口地址赋给一个指针变量&#xff0c;使该指针变量指向该函数。然后通过指针变量就可以调用这个…

基本数据类型和包装类型的区别、缓存池、自动拆箱装箱(面试题)

目录 1. 八种基本类型及对应包装类型 2. 基本类型和包装类型 区别 3. 自动拆箱装箱 3.1 自动装箱 3.2 自动拆箱 3.3 缓存池 4. 高频面试案例分析 1. 八种基本类型及对应包装类型 基本数据类型类型描述范围&#xff08;指数形式&#xff09;位数包装类型byte整型&#x…

双子数(枚举素数)

#include <iostream> #include <vector> #include <cmath> using namespace std;vector<long long> generate(long long n) {vector<bool> is(n 1, true);// 标记是否为素数&#xff0c;初始值全为 truevector<long long> v;is[0] is[1]…

Springboot集成ElasticSearch实现minio文件内容全文检索

一、docker安装Elasticsearch &#xff08;1&#xff09;springboot和Elasticsearch的版本对应关系如下&#xff0c;请看版本对应&#xff1a; 注意安装对应版本&#xff0c;否则可能会出现一些未知的错误。 &#xff08;2&#xff09;拉取镜像 docker pull elasticsearch:7…

思源笔记 Creating group siyuan (1000) permission denied (are you root?)

错误提示 siyuan_jx85-1 | Creating group siyuan (1000) siyuan_jx85-1 | addgroup: permission denied (are you root?) siyuan_jx85-1 | Creating group siyuan (1000) siyuan_jx85-1 | addgroup: permission denied (are you root?) siyuan_jx85-1 | Creating group siy…

基于Matlab的碎纸片的自动拼接复原技术

碎纸片的自动拼接复原技术 摘要&#xff1a;破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。目前发现对碎纸片的拼接大部分由人工完成&#xff0c;准确率较高&#xff0c;但耗费大量人力财力及时间&#xff0c;效率很低。随着计算机技术的…

SpringBoot(5)-SpringSecurity

目录 一、是什么 二、实战测试 2.1 认识 2.2 认证和授权 2.3 权限控制和注销 2.4 记住我 一、是什么 Spring Security是一个框架&#xff0c;侧重于为java应用程序提供身份验证和授权。 Web应用的安全性主要分为两个部分&#xff1a; 认证&#xff08;Authentication&…

【eNSP】企业网络架构实验——vlan间的路由通信(三)

VLAN间的路由是指不同VLAN之间的通信&#xff0c;通常VLAN是用来分割网络流量和提高网络安全性的。 一、VLAN 1. 什么是VLAN&#xff1f; VLAN&#xff0c;全称是虚拟局域网&#xff08;Virtual Local Area Network&#xff09;&#xff0c;是一种将物理局域网&#xff08;LA…

DAY65||Bellman_ford 队列优化算法(又名SPFA)|bellman_ford之判断负权回路|bellman_ford之单源有限最短路

Bellman_ford 队列优化算法&#xff08;又名SPFA&#xff09; 94. 城市间货物运输 I 思路 大家可以发现 Bellman_ford 算法每次松弛 都是对所有边进行松弛。 但真正有效的松弛&#xff0c;是基于已经计算过的节点在做的松弛。 给大家举一个例子&#xff1a; 本图中&#xff…

FRP 实现内网穿透

如何通过 FRP 实现内网穿透&#xff1a;群晖 NAS 的 Gitea 和 GitLab 访问配置指南 在自建服务的过程中&#xff0c;经常会遇到内网访问受限的问题。本文将介绍如何利用 FRP&#xff08;Fast Reverse Proxy&#xff09;来实现内网穿透&#xff0c;以便在外网访问群晖 NAS 上的…

【优选算法 — 滑动窗口】水果成篮 找到字符串中所有字母异位词

水果成篮 水果成篮 题目描述 因为只有两个篮子&#xff0c;每个篮子装的水果种类相同&#xff0c;如果从 0 开始摘&#xff0c;则只能摘 0 和 1 两个种类 &#xff1b; 因为当我们在两个果篮都装有水果的情况下&#xff0c;如果再走到下一颗果树&#xff0c;果树的水果种类…

1、使用vscode+eide+stm32cubeMx开发stm32

步骤1&#xff1a;在vscode中安装如下的插件 步骤2&#xff1a;点击Embedded IDE&#xff0c;点击“新建项目”-----空项目-----Cortex-M项目。 步骤3&#xff1a;输入项目名&#xff0c;回车后会要制定保存路径&#xff0c;此时就是一个已项目名命名的文件夹。 步骤4&#xff…

【数据库系列】 Spring Boot 集成 Neo4j 的详细介绍

Spring Boot 提供了对 Neo4j 的良好支持&#xff0c;使得开发者可以更方便地使用图数据库。通过使用 Spring Data Neo4j&#xff0c;开发者可以轻松地进行数据访问、操作以及管理。本文将详细介绍如何在 Spring Boot 应用中集成 Neo4j&#xff0c;包括基本配置、实体定义、数据…

高亚科技签约美妥维志化工,提升业务协同与项目运营效率

近日&#xff0c;中国企业管理软件资深服务商高亚科技与韶关美妥维志化工有限公司&#xff08;以下简称“美妥维志”&#xff09;正式签约。基于高亚科技的8Manage PM项目管理软件&#xff0c;美妥维志将实现项目进度、人员审批及问题的统一管理&#xff0c;提升部门间协同效率…

Python安装(ubuntu)

一&#xff1a;安装指定版本的python python3 --version直接返回ubuntu自带的3.8.10的版本 radarswradarsw-Precision-5560:~$ python3 --version Python 3.8.10通过指令直接安装&#xff0c;会报错如下; radarswradarsw-Precision-5560:~$ sudo apt install python3.11 正在…

大模型基础BERT——Transformers的双向编码器表示

大模型基础BERT——Transformers的双向编码器表示 整体概况 BERT&#xff1a;用于语言理解的深度双向Transform的预训练 论文题目&#xff1a;BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding Bidirectional Encoder Representations from…

云计算复习文档

云计算复习文档 一 云计算概述 名词&#xff1a; 云计算 1.0 &#xff1a; 面向数据中心管理员的IT基础设施资源虚拟化阶段 通过计算虚拟化技术将企业IT应用与底层的基础设施彻底分离、解耦 将多个企业IT应用实例及运行环境复用在相同的物理服务器上&#xff0c;并通过虚…