MySQL索引index

news2024/11/27 8:35:26

目录

1.索引的概念

2.索引的优缺点

3.索引的数据结构

4.索引结构

1.二叉树:

​编辑2.红黑树:

3.BTree(B-Tree):

​编辑4.传统B+Tree:  

​编辑5.MySQL中的B+Tree:

​编辑6.Hash:

5.为什么InnoDB选择使用B+Tree

1.相对于二叉树

2.相对于B-Tree

3.相对于Hash索引

6.索引分类:

7.在InnoDB存储引擎中,按照索引的存储形式,索引分为

1.聚集索引,Clustered Index:

2.二级索引,Secondary Index(也叫做辅助索引):

​编辑3. 聚集索引的选取规则

4.聚集索引和二级索引的区别:

5.回表查询:

​编辑8.InnoDB主键索引的B+Tree高度

9.索引语法

10.SQL性能分析工具

1.SQL执行频率

2.慢查询日志:

3.profile详情:        

4.explain执行计划:

5.explain的各字段含义:        

11.索引使用原则

1.最左匹配原则:

2.范围查询:

3.索引列运算

4.字符串:

5.模糊查询

6.or连接的原则

7.数据分布影响

8.SQL提示

9.覆盖索引

10.前缀索引

11.单列索引和联合索引

12.索引的设计原则


1.索引的概念

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

2.索引的优缺点

        优点:高效查询数据;索引能够对数据进行排序
        缺点:索引要占用空间;数据增删改查后也要更新索引,降低更新表的速度

3.索引的数据结构

        MySQL索引是在存储引擎层实现的,不同存储引擎结构不同
        主要结构:B+Tree(最常见)、Hash索引(不支持范围查询) 

4.索引结构


1.二叉树:

        顺序插入时,形成链表,查询性能降低;数据量大时,检索速度慢  


2.红黑树:

        解决树的平衡问题,但数据量过大时,层级较深,搜索速度慢  


3.BTree(B-Tree):

        有最大度数,树的度数指一个节点的最大子节点个数,最大度数为n,则最多有n个子节点,最多有n-1个key,n个指针
    * 根结点和叶子结点中,存储着key和相对应的数据
    * 当存储的key的个数达到n-1后会使用 中间元素向上分裂 的方法,如果向上分裂也使得key达到了n-1个,则继续使用 中间元素向上分裂  


4.传统B+Tree:  


    * 所有的元素都会出现在叶子结点;
    * 分叶子结点只起到索引作用,叶子结点用来存放数据,并且叶子结点之间还形成了单向链表,每一个结点都会通过指针指向下一个元素
    * 存储的key个数达到n-1后使用 中间元素向上分裂方法,但此时该元素仍会出现在叶子结点,并且叶子结点形成了单向链表,非叶子结点只是起到索引的作用 


5.MySQL中的B+Tree:

        增加了一个指向相邻叶子结点的链表指针(相邻变为双向链表),形成了带有顺序指针的B+Tree  


6.Hash:

采用hash算法,将键值换算为新的hash值,映射到对应槽位,存储在hash表中
    * 只能用于等值比较,不支持范围查询
    * 无法利用索引完成排序操作
    * 查询效率高,通常只需要进行一次检索,效率通常高于B+Tree索引


5.为什么InnoDB选择使用B+Tree

1.相对于二叉树

        层级更少,搜索效率高  


2.相对于B-Tree

        B-Tree的叶子结点和非叶子结点都会存储数据,索引和数据存储在页/块中,页的大小只有16k,若存放了数据则能存放的指针就少了,若数据过多,只能通过提高树的层级来存放指针,导致性能降低  


3.相对于Hash索引

        无法支持范围匹配

6.索引分类:


主键索引:针对表中主键创建的索引,primary(只能有一个)
唯一索引:避免同一个表中某数据列中的值重复,unique
常规索引:快速定位特定数据
全文索引:全文索引查找文本中的关键词,fulltext

7.在InnoDB存储引擎中,按照索引的存储形式,索引分为


1.聚集索引,Clustered Index:

        将数据存储和索引放在一起,索引结构的叶子节点保存了行数据;必须有且只有一个,否则无法存放行数据  


2.二级索引,Secondary Index(也叫做辅助索引):

        将数据和索引分开存储,索引结构的叶子结点关联的是对应主键;可以存在多个


3. 聚集索引的选取规则


    * 若存在主键,主键索引就是聚集索引
    * 若不存在主键,使用第一个唯一索引作为聚集索引
    * 若没有主键,也没有合适的唯一索引,InnoDB会自动生成一个rowid作为隐藏的聚集索引

4.聚集索引和二级索引的区别:

        聚集索引的叶子结点下面是这一行的数据,二级索引叶子结点下面是对应的主键

5.回表查询:

        先通过二级索引寻找到对应的主键值,然后根据主键值到聚集索引中查询相应的行数据


8.InnoDB主键索引的B+Tree高度

        InnoDB的B+Tree高度为3的情况下就能够存储两千多万条数据(主键使用Bigint,占用8字节的情况下)


9.索引语法

创建索引

CREATE[ UNIOUE|FULLTEXT] INDEX INDEX NAME ON TABLE NAME (INDEX col NAME,... ) ;

查看索引

SHOW INDEX FROM TABLE_NAME :

删除索引

DROP INDEX INDEX NAME ON TABLE_NAME ;


10.SQL性能分析工具


1.SQL执行频率

        以增删改为主的表,则优化比重小;以查询为主的表,需要优化
    * 用

SHOW GLOBAL/SESSION STATUS 'Com_'

查询当前表的增删改查的频率

2.慢查询日志:

        记录所有执行时间超过指定参数long_query_time(默认10s)的所有SQL语句的日志
    * 慢查询日志默认没有开启
    * 使用show variables like ‘slow_query_log’查询是否开启了慢查询日志

​
SHOW VARIABLES LIKE 'slow_query_log';

​


    * 开启慢查询日志:在MySQL配置文件中配置


3.profile详情:        

        能够了解每一条SQL语句执行情况,比如消耗时长
    * 默认关闭,使用set profiling=1,设置开启
    * 使用show profiles,查看执行情况

show profiles;


4.explain执行计划:

        通过explain能够回去MySQL执行查询语句的具体信息,包括select语句执行过程中表如何连接以及连接的顺序

EXPLAIN SELECT  goods_name FROM t_goods;


5.explain的各字段含义:        


    * id:select查询的序列号,代表查询中执行select或者操作表的顺序;ID相同,执行顺序从上到下;ID不同,值越大,越先执行
    * select_type:select的查询类型
    * type:连接类型,性能优好到差的连接类型:Null、system、const、eq_ref、ref、range、index、all
    * possible_key:显示可能应用在这张表的索引,一个或者多个
    * key:实际使用的索引,为null则没有使用索引
    * key_len:使用到的索引的字节数,长度越短越好
    * rows:执行查询的行数,是一个估计值,并不总是准确的
    * filtered:表示返回结果的行数占需要读取行数的百分比,filtered值越大越好


11.索引使用原则


1.最左匹配原则:

        联合索引的查询会从索引的最左列开始,不跳过索引中的列,若跳过了某一列,则后面的字段索引都会失效


2.范围查询:

        联合索引中,出现返回查询大于或小于,则范围查询右侧的列索引实效
    * 解决方法,尽可能使用大于等于或小于等于,不会出现这种问题


3.索引列运算


    * 若在索引列上进行运算操作,索引会失效(比如截取字符串)


4.字符串:

        字符串不加引号,索引将失效


5.模糊查询


    * 若只有尾部模糊匹配,索引不会失效;若头部模糊匹配,索引失效


6.or连接的原则


    * 用or分开的条件,若or前条件的列有索引,or后面的列没有索引,则涉及的索引都不会用到
    * 只有or两侧都有索引,索引才会生效


7.数据分布影响


    * 若MySQL评估使用索引比全表扫描更慢,则不使用索引


8.SQL提示


    * 在SQL语句中加入一些人为提示来达到优化操作的目的

9.覆盖索引


    * 查询使用了索引,并且需要返回的列在该索引中能够全部找到(尽量减少select *;而是在select后将需要查询的数据和索引中的数据对应起来)

10.前缀索引


    * 只将字符串的一部分前缀抽取出来建立索引
    * 一般用于字符串较长的场景,节约索引空间
    * 创建前缀索引
    

CREATE INDEX idx_xxx ON TABLE_NAME(COLUMN(n))


11.单列索引和联合索引


    * 单列索引:一个索引只包含单个列
    * 联合索引:一个索引包含多个列
    * 推荐使用联合索引,很多时候能够覆盖索引,能够减少回表查询


12.索引的设计原则


* 针对数据量较大,查询比较频繁的表建立索引(一百万数据以上)
* 针对常作为查询条件where、排序order by操作的人字段建立索引
* 尽量选择区分度高的列作为索引,尽量建立唯一索引
* 字符串类型字段可以选择前缀索引
* 尽量使用联合索引,很多时候可以覆盖索引,避免回表操作
* 控制索引数量,不能过多
* 索引列不能存储Null值一定要使用not null进行约束

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

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

相关文章

浅谈电子设备之电磁屏蔽箱设计要点

屏蔽箱又称隔离箱、屏蔽盒和电磁屏蔽箱,可以对传导和辐射进行处理,为无线通讯产品生产制造提供高效的隔离测试环境,测试内容包含耦合测试、RF功能测试、电磁干扰测试和电磁兼容性测试。屏蔽箱多采用铝合金材料设计,屏蔽材料阻隔能…

C语言模拟实现字符串处理函数

需要多一点点勇气,来面对变差的自己 大家好,我是纪宁。 这篇文章为大家带来的是5大字符串处理函数的模拟实现。 文章目录 1.strlen函数的模拟实现 2.strcpy函数的模拟实现 3.strcmp函数的模拟实现 4.strcat函数的模拟实现 5.strstr函数的模拟实现…

相机标定-基础(一)

1. 何为相机标定? 当相机拍摄照片时,我们看到的图像通常与我们实际看到的不完全相同。这是由相机镜头引起的,而且发生的频率比我们想象的要高。 这种图像的改变就是我们所说的畸变。一般来说,畸变是指直线在图像中出现弯曲或弯曲。 这种畸变我们可以通过相机标定来进行解…

反常积分题目

目录 题目1: 题目2: 题目3:​ 题目4: 题目5: 题目6: 题目7: 我们首先引入反常积分的定义: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/131676865 题目1: 题目2…

STM32 ws2812b多屏驱动程序

文章目录 前言一、ws2812b的数据传输以及屏幕的组合二、代码ws2812screen.c文件ws2812screen.h文件主函数 前言 在上篇文章中使用了stm32的dmatim的方式点亮了ws2812b的灯 但是我的需求不仅仅是点亮他,我需要他像屏幕一样显示某一些东西,ws2812显示有一…

深入学习 Redis - 全局命令、过期策略如何实现、高效定时器原理

目录 Redis 全局命令 get 和 set keys keys 使用注意事项 exists exists 使用注意事项 del del 使用注意事项 expire 【面试经典】redis 中 key 的过期策略是怎么实现的? 定时器实现原理(非 Redis 实现,拓展) 1.基于 …

21 - 队列 - 循环队列——队列的顺序表示和实现

前面我们学习数组队列,链式队列,我们今天来学习循环队列。 队列的定义 队列(Queue)也是一种线性表, 但是它仅能在一端进行插入,而另一端进行删除的操作 ,插入的一端称为 队尾rear,删除的一端称为 队头front 。 向一个栈插入新元素又称作进队或入队, 从一个栈删除元素…

从实体按键看 Android 车载的自定义事件机制

在汽车数字化、智能化变革的进程中,越来越多的车机设计或部分、或全部地舍弃了实体按键,进而把车主操作的入口转移到了车机 UI 以及语音助手。 但统一、高效的零层级 UI 颇为困难,语音的准确率、覆盖率亦不够完善,那么在当下的阶段…

【数据结构】文件的归并排序

目录 1、归并排序引申出的问题 2、磁盘与文件的关系---包含与被包含的关系 3、思路: 4、代码实现 1、归并排序引申出的问题 归并排序是最常用的外排序的方法(但归并排序既可进行内部排序也可进行外部排序),外排序就是在磁盘中…

LLaMA(Open and Efficient Foundation Language Models )论文解读(二)

此篇博客主题:LLAMA模型数据、训练时长、功耗及碳排放量 LLaMA: Open and Efficient Foundation Language Models paper https://arxiv.org/pdf/2302.13971v1.pdf 1 训练样本 Overall, our entire training dataset contains roughly 1.4T tokens after tokenization. For mo…

2023年Q2京东厨卫大电市场分析报告(京东运营数据分析)

随着新产品推广和消费需求升级,今年Q2,京东厨卫大电市场的销售额突破百亿,从同环比来看均呈增长趋势。百亿市场中,油烟机、电热水器、燃气热水器这三大品类占据较大份额,这一期,我们重点来看一下京东厨卫大…

怎么用Postman脚本中发送请求

Postman的Collection(集合)/Folder(集合的子文件夹)/Request(请求)都有Pre-request script和Tests两个脚本区域, 分别可以在发送请求前和请求后使用脚本(基于Javascript实现各种操作) 在遇到有依赖的接口时,比如需要登录或者需要从前一个接口的结果中获取参数时,我们往往需要在…

vscode 调试(linux )

一、配置程序运行依赖 1, 打开配置文件(launch.json) (1) 从工具栏打开Run–>Add Configuration… (2)查看配置文件(launch.json) 2,添加配置 (1) 配置可执行程序(program)…

ceph存储的应用

ceph存储的应用 一:创建 CephFS 文件系统 MDS 接口1.服务端操作1)在管理节点创建 mds 服务2)查看各个节点的 mds 服务3)创建存储池,启用 ceph 文件系统4)查看mds状态,一个up,其余两个…

reggie优化01-缓存短信验证码和菜品数据

1、缓存短信验证码 1.1 Redis配置类RedisConfig 在config包下,创建Redis配置类RedisConfig: 纳入Git管理: package com.itheima.reggie.config;import org.springframework.cache.annotation.CachingConfigurerSupport; import org.sprin…

接口自动化测试框架unittest和pytest差异比较

前言 说到 Python 的单元测试框架,想必接触过 Python 的朋友脑袋里第一个想到的就是unittest。 的确,作为 Python 的标准库,它很优秀,并被广泛用于各个项目。但你知道吗?其实在 Python 众多项目中,主流的单…

【ROS机械臂入门教程】

首先声明一下,此项目是参考B站哈萨克斯坦UP的【ROS机械臂入门教程】,前期以复现【机械臂视觉抓取从理论到实战】 此内容为他研究生生涯的阶段性成果展示和技术分享,所有数据和代码均开源。所以鹏鹏我又特此来复现一下,我采用的硬件…

Redis源码篇 - Reactor设计模式 和 Redis Reactor设计模式

Reactor :反应器模式或者应答者模式,它是一种基于事件驱动的设计模式。拥有一个或者多个输入源,通过反应器分发给多个worker线程处理,实现并发场景下事件处理。 此图网上找的,画的很好:

中国新一代载人运载火箭“长征十号”发布,衍生型号积极研发中

我国新一代载人运载火箭“长征十号”已发布,主要用于将月面着陆器和登月飞船送入地月转移轨道。此外,“长征十号”还有一个衍生型号正在积极研发中。根据中国运载火箭技术研究院官方消息,近期,火箭院北京强度环境研究所圆满完成了…

SQlite3数据库相关相关命令

1&#xff09;系统命令 以 ‘.’ 开头 .help 帮助手册 .exit 退出 .table 查看当前数据库的有的表格名 .databases .schema 查看表的结构属性2&#xff09;sql语句 以 ;结尾 1. 创建表格 create table <table-name> (id integer, age integer, name char, score f…