索引的概述和性能分析

索引index,是一种有序的数据结构,可以高效的获取数据,在数据库中维护着满足查找特定算法的数据结构,就是索引

无索引的情况,查询数据时会全表扫描,效率极低

索引结构

(1)二叉树,查询性能还行,但当数据顺序插入时,就会形成链表,数据量大时,层级就深,查询效率慢

(2)红黑树,是普通二叉树优化,但本质仍是二叉树,不适合大数据情况

(3)BTree,即多路平衡查找树,该树一个节点下可以挂多个节点,以一个5阶的树,他的每个节点底下可以挂5个子节点,每个节点最多存储4个key,5个指针。节点中超过了4个key,就会向上分裂。

(4)B+Tree,以4阶的树为例,所有的元素都会出现在叶子节点,上面的节点不存放数据,且叶子节点形成了单项链表、

在mysql中的B+Tree中,对普通的树进行了优化,即叶子节点形成的不再是单向链表,而是双向链表

(5)Hash用一定的hash算法,算出对应的hash值,映射到对应的位置上,然后存储在hash表中

多个key计算的hash值有可能重复,可以通过链表来解决(类似HashMap)

Hash只能用于对等比较,不能范围查询,也不能排序,因为查询结果无序,但查询效率高,通常只需要查询一次,有时候遇到hash碰撞要多查询

索引的分类

(1)主键索引PRIMARY

(2)唯一索引UNIQUE

(3)常规索引

(4)全文索引FULLTEXT

innoDB中,索引按存储形式又分为聚集索引和二级索引

聚集索引就是叶子节点下挂的是这一行的行数据,而二级索引的叶子节点下挂的是表的主键,还要通过主键再次索引

如果表有主键,主键索引就是聚集索引

不存在主键,将使用第一个unique索引作为聚集索引

上述都不存在,则会自动生成一个rowid作为聚集索引

索引的语法

(1)查看对应表的索引 show index from 表名;

(2)创建索引 create [ PRIMARY/UNIQUE/FULLTEXT] index 索引名 on 表名;

索引名一般这样取:idx_

--------------------------

索引性能优化

性能的优化主要是优化查询语句,所以怎么才能知道什么表中的查询较多呢?

(1)根据show [session / global] status like 'Com__9_____';可以访问CRUD的访问频次

(2)查看慢查询日志

所有执行时间超过参数long_query_time的查询都会被记录在慢查询日志,默认下慢查询日志未开启

(3)profile

数据库支持profile的话可以使用,可以使用select @@have_profiling查看是否支持

profiling默认为关闭,需要set profiling = 1打开开关

show proflies能够帮我们查看sql优化中,时间都花在了哪里

(4)explain执行计划

前三种方法都只是在时间上判断sql语句性能,而explain或desc可以获取如何执行select的信息,包括在执行中表如何连接,和连接的顺序情况

explain执行计划中,各个字段的含义:

id:select查询的序列号,表示查询中执行select字句或是操作表的顺序,当id相同时,执行顺序从上到下,id不同,则id越大,越先执行。

select_type:表示select的类型,一般有primary(主查询,即外层查询),simple(不使用表连接或子查询),union(union中的第二个或之后的查询语句),subquery(子查询)

type:表示连接类型,性能由好到差的连接类型为:null(不使用任何表),system(访问了系统表),const(使用主键或唯一索引访问),eq_ref,ref(使用非唯一索引),range(范围查询),index,all,优化sql时尽量往前优化。

possible_keys:可能应用到这张表上的索引

keys:实际使用的索引,无则为null

key_len:索引使用的字节数,一般来说长度越短越好

rows:mysql认为必须要执行查询的行数,是一个估计值

filtered:返回结果的行数占需读取行数的百分比,越大越好

extra:额外展示的信息

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

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

相关文章

flink学习之水位线

什么是水位线 在事件时间语义下,我们不依赖系统时间,而是基于数据自带的时间戳去定义了一个时钟, 用来表示当前时间的进展。于是每个并行子任务都会有一个自己的逻辑时钟,它的前进是靠数 据的时间戳来驱动的。 我们可以把时钟也以…

Linux下MySQL用户管理、权限、密码

一、原理 MySQL的用户管理实质上是对用户表的管理,系统中的数据库mysql存在一张用户表(user),所有的用户都在该表内,对用户的管里也就是对该表进行增删查改的操作。 show databases; 如图中的mysql数据库,…

Leetcode 用队列实现栈

题目: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。 int pop() 移除并…

2024/1/20 并查集

目录 并查集关键代码 亲戚 村村通 团伙(新知识) 并查集关键代码 返回祖宗节点路径压缩: int find(int x) {if(f[x]!x) f[x]find(f[x]);return f[x]; } 合并: void make(int x,int y) {int f1find(f[x]);int f2find(f[y]);…

69.使用Go标准库compress/gzip压缩数据存入Redis避免BigKey

文章目录 一:简介二:Go标准库compress/gzip包介绍ConstantsVariablestype Headertype Reader 三:代码实践1、压缩与解压工具包2、单元测试3、为何压缩后还要用base64编码 代码地址: https://gitee.com/lymgoforIT/golang-trick/t…

图像分割实战-系列教程15:deeplabV3+ VOC分割实战3-------网络结构1

🍁🍁🍁图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 deeplab系列算法概述 deeplabV3 VOC分割实战1 deeplabV3 VOC分割实战2 deeplabV3 VOC分割实战3 dee…

C#中chart控件

C#中chart控件 图表的5大集合 例子 第一步:创建工程 放入chart控件 series集合 选择图标类型 选择绘制曲线的宽度和颜色。 显示数据标签 Title集合 添加标题 调整标题字体:大小和颜色 CharsArea集合 对坐标轴进行说明 设置间隔 设置刻度…

使用Ultimate-SD-Upscale进行图片高清放大

之前我们介绍过StableSR进行图片高清放大,如果调的参数过大,就会出现内存不足的情况,今天我们介绍另外一个进行图片高清放大的神器Ultimate-SD-Upscale,他可以使用较小的内存对图像进行高清放大。下面我们来看看如何使用进行操作。…

Spark读取kafka(流式和批数据)

spark读取kafka(批数据处理) # 按照偏移量读取kafka数据 from pyspark.sql import SparkSessionss SparkSession.builder.getOrCreate()# spark读取kafka options {# 写kafka配置信息# 指定kafka的连接的broker服务节点信息kafka.bootstrap.servers: n…

无法访问云服务器上部署的Docker容器

说明:记录一次无法访问云服务器上部署的Docker容器的问题。 问题描述 某次,我在云服务器上,使用Docker运行了一个Nginx容器,用公网IP怎么也访问不到。这种情况博主也算有经验,可以从以下几个方面去排查: …

舵机使用总结

文章目录 1 舵机简介2 注意事项3 编写驱动程序3.1 使用STM32作为控制器3.1.1 计算高电平对应程序中的取值范围3.1.2 编写控制程序 1 舵机简介 舵机使用PWM控制,周期为20ms,通过改变高电平占空比来驱动,高电平通常为1~2ms( 或 0.5 …

RabbitMQ系列之入门级

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《RabbitMQ系列之入门级》。🎯&#x…

YOLOv8全网首发:新一代高效可形变卷积DCNv4如何做二次创新?高效结合SPPF

💡💡💡本文独家改进:DCNv4更快收敛、更高速度、更高性能,与YOLOv8 SPPF高效结合 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适合paper !!! 💡💡💡…

AOI与AVI:在视觉检测中的不同点和相似点

AOI(关注区域)和AVI(视觉感兴趣区域)是视觉检测中常用的两个概念,主要用于识别和分析图像或视频中的特定区域。虽然这两个概念都涉及到注视行为和注意力分配,但它们在定义和实际应用等方面有一些差异。 AOI…

x86-x64汇编语言、反汇编知识和IDA

x86-x64汇编语言 基础知识 x86寄存器: 通用寄存器:EAX, EBX, ECX, EDX, ESI, EDI 栈顶指针寄存器:ESP 栈底指针寄存器:EBP 指令计数器:EIP 段寄存器:CS, DS, ES, FS, GS, SS x86-64寄存器:&a…

2.【C语言】(函数指针||sizeof||笔试题)

0x01.函数指针 void test(const char* str) {printf("%s\n", str); }int main() {void (*pf)(const char*) test;//pf是函数指针变量void (*pfarr[10])(const char*);//pfarr是存放函数指针的数组void (*(*p)[10])(const char*) &pfarr;//p是指向函数指针数组…

Leetcoder Day10|栈与队列part02(栈的应用)

语言:Java/C 目录 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 今日总结 20. 有效的括号 给定一个只包括 (,),{,},[,] 的字符串,判断字符串是否有效。 有效字…

WEB接口测试之Jmeter接口测试自动化 (三)(数据驱动测试)

接口测试与数据驱动 1简介 数据驱动测试,即是分离测试逻辑与测试数据,通过如excel表格的形式来保存测试数据,用测试脚本读取并执行测试的过程。 2 数据驱动与jmeter接口测试 我们已经简单介绍了接口测试参数录入及测试执行的过程&#xff0…

Unity3D Pico VR 手势识别物体交互 适配 MRTK3

当前Pico已经支持手势识别了,但是提供的PICO Unity Integration SDK 中是没有手势和物体交互的功能,Unity XR Interaction Toolkit提供的手势识别物体交互对 Quest适配的挺好的,Pico 当前只能用指尖点触还不能对物体进行抓握以及手势控制射线…

数据结构一:算法效率分析(时间复杂度和空间复杂度)-重点

在学习具体的数据结构和算法之前,每一位初学者都要掌握一个技能,即善于运用时间复杂度和空间复杂度来衡量一个算法的运行效率。所谓算法,即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,…