进阶篇02——索引
概述


结构


B+树索引


在这里推荐一个可以将个各种数据结构可视化的网站:数据结构可视化


哈希索引


相关的一个面试题

分类

聚集索引和二级索引(非聚集索引)



思考题:索引思考题
创建索引语法
如果一个索引关联多个字段,那么这个索引叫联合索引或复合查询,字段的书写顺序会影响索引的使用,具体见索引使用规则部分
一般索引名称为index_表名_要建立索引字段名


SQL性能分析
通过命令的方式判断


慢查询日志
通过MySQL提供的慢查询日志,可以定位出哪些SQL语句执行的时间超出我们指定的时间,从而可以对这些SQL进行优化。

show profile


expplain执行计划

一般SQL优化要关注type、key、key_len、possible_key、extra这几个字段


索引使用规则
造成索引失效的情况
假设现在有一个user表,表中包含name,age,和status三个字段,并为这三个字段创建了联合索引test_index
创建索引:
create index test_index on user(name, age, status);
根据创建索引所书写的字段顺序,索引的最左列字段是name,最右列的字段是status,中间的是age
最左前缀法则
最左前缀法则如下:
当查询时,有以下几种情况:
(1)索引中的三个字段都用上(where后三个字段的顺序不重要):select * from user where name="zs" and age=18 and status=1; 这种情况下三个字段的查询都用上了联合索引test_index
(2)用上了最左边的一个或几个字段:select * from user where name="zs" and age=18; 这种情况下也是name和age两个字段的查询都用上了联合索引test_index
(3)而如果跳过左侧的某个列,那么该列之后的列都不会使用联合索引进行查询,比如跳过了age这一列:select * from user where name="zs" and status=1; 那么age之后(在创建索引时age之后的字段是status)的字段status不会使用联合索引test_index进行查询,而是全表查询。即name使用索引test_index进行查询,而status因为跳过了其左侧的age,所以索引失效,采用全表查询。同理,select * from user where age=18 and status=1; 这个查询里的age和status都索引失效,因为跳过了它们的左侧索引name,age和status采用的是全表查询
上面三种情况是否使用索引查询可以通过在select查询语句前加explain关键字的执行计划进行验证,可以看到执行计划中的key_len在不同的情况下值不一样,值越大说明用上索引的的字段越多
最左前缀法则只要求左侧的列都存在,至于这几个列在where的书写顺序并不重要
范围查询
出现大于小于(>,<)的范围查询时,范围查询右侧的列索引失效
当出现范围查询时,有以下几种情况:
(1)select * from user where name='zs' and age > 20 and status=1; 这种情况下由于age使用了大于的范围查询,所以status字段的索引失效,status使用的全表查询。可以使用大于等于或小于等于来解决这个问题。所以在实际应用中,如果允许则尽量使用>=和<=符号
其他几种情况




当数据库中的大部分数据都符合查询条件,那么就可能全表查询的效率高于索引查询,则采用的就是效率高的全表查询。
比如一张表中大部分数据的name字段都是非空(name字段建立了索引),而查询该表name为空的数据(表中只有少量数据符合条件), 那么此时索引查询的效率高于全表查询,就会采用索引查询。而如果查询的是name不为空的数据(此时表中大部分数据都符合),那么就会采用全表查询。
反之,如果一张表的大部分数据的name都是空(name字段建立了索引),而查询该表name为空的数据(此时表中大量数据符合条件), 那么此时全表查询的效率高于索引查询,就会采用全表查询。而如果查询的是name不为空的数据(表中只有小部分数据符合),那么就会采用索引查询。
SQL提示
SQL提示就是当一个字段有多个索引时,在实际查询时建议/忽略/强制使用哪个索引。比如一个字段即建立了单列索引,又在联合索引中且联合索引生效,那么可以通过下面三个关键字指定MySQL实际查询时使用单列索引还是联合索引

覆盖索引
这个感觉不好做笔记,看视频吧:覆盖索引
前缀索引
假设下图中的字段email是个长字符串,要对其建立索引。表中所有数据量为total=count(*),表中去重后所有的email总数num=count(distinct email),得到两个数的比值:d1 = num / total;比值d1越大说明email字段的重复率越低,即email的唯一性越高;
如果要判断n的合适取值,就可以看比值d2 = count(distinct substring(email, 1, 5)) / count(*)(SQL中的字符串索引从1开始,这里表示截取前5个字符);综合考量d2的值和n,看实际需求是侧重查找效率还是侧重索引体积,侧重效率则取让d2值大的n,侧重体积则取允许范围内的n

单列索引VS联合索引

索引设计原则

相关文章:
进阶篇02——索引
概述 结构 B树索引 在这里推荐一个可以将个各种数据结构可视化的网站:数据结构可视化 哈希索引 相关的一个面试题 分类 聚集索引和二级索引(非聚集索引) 思考题:索引思考题 创建索引语法 如果一个索引关联多个字段ÿ…...
三:SpringBoot的helloworld和使用Springboot的优点以及快速创建Springboot应用
三:SpringBoot的helloworld和使用Springboot的优点以及快速创建Springboot应用 一:HelloWorld [我们创建的是maven项目或者直接创建一个Spring] 1.1:创建一个maven 项目(1】:需要自己手动写一个SpringBoot 的启动类同…...
网络仿真方法综述
目录 1. 引言 2.仿真器介绍 2.1 NS-2 2.2 NS-3 2.3 OPNET 2.4 GNS3 3.仿真对比 4.结论 参考文献 1. 引言 网络仿真是指使用计算机模拟网络系统的行为和性能的过程。在网络仿真中,可以建立一个虚拟的网络环境,并通过模拟各种网络设备、协议和应用程…...
Android-Q升级-Camera记录
目录 代码环境 建立Android Q使用的camera仓 Camera底层适配 camx 原生接口变化 其他编译问题 chi-cdk 数据类型不匹配 case未加break的报错 libalRnBRT_GL_GBWRAPPER链接问题 vidhance编译错误 libarcsat链接问题 vendor/qcom/proprietary prebuilt_HY11 调试cam…...
Android studio如何导入项目
打开解压好的安装包 找到build.gradle文件 打开查看gradle版本 下载对应的gradle版本Index of /gradle/(镜像网站) 下载all的对应压缩包 配置gradle的环境变量 新建GRADLE_HOME 将GRADLE_HOME加入到path中 将项目在Android studio中打开进行配置 将gr…...
PHP实现一个简单的接口签名方法以及思路分析
文章目录 签名生成说明签名生成示例代码签名校验示例代码 签名生成说明 B项目需要调用A项目的接口,由A项目为B项目分配 AccessKey 和 SecretKey,用于接口加密,确保不易被穷举,生成算法不易被猜测。 最终需要确保包含签名的参数只…...
StartAI”梦想合伙人 ”招募计划
我们正火热招募AI设计师产品合伙人!如果你对AI技术充满好奇,对设计有着独特的见解和热情,亦或者你想在日常的设计工作中提高效率,无论你是电商设计师、UI设计师、建筑师、插画师等其他各类设计领域的人才。那么这就是你不容错过的…...
记录:podman安装redis
Linux系统上安装redis: podman pull redis # 拉取最新的redis版本 podman images # 查看所有本地的镜像,包括刚拉取的redis镜像mkdir -p /etc/redis/conf /etc/redis/data # 创建2个目录文件,保存redis的数据和配置文件 tou…...
TrinityCore启动报错: MySQL library version (8.0.37 id 80037) does not match
TrinityCore启动的时候报错: TrinityCore/src/server/database/Database/DatabaseWorkerPool.cpp:73 in DatabaseWorkerPool FATAL ERROR: Used MySQL library version (8.0.37 id 80037) does not match the version id used to compile TrinityCore (id 80036). S…...
代码随想三刷字符串篇
代码随想三刷字符串篇 344. 反转字符串题目代码541. 反转字符串 II题目代码54. 替换数字(第八期模拟笔试)题目代码151. 反转字符串中的单词题目代码55. 右旋字符串(第八期模拟笔试题目代码28. 实现 strStr()题目代码459.重复的子字符串题目代码344. 反转字符串 题目 链接 …...
华为支持手指关节手势的原理
华为的指关节手势有指关节截屏、指关节录屏、指关节区域截屏、指关节分屏等。该技术的实现是靠触控结合了其他一些传感器实现的。 华为的专利: 一种手势控制方法、装置、终端设备和存储介质——华为技术有限公司 专利中提到以往终端设备对于手势的识别都是基于位置和…...
Flink的简单学习五
一 动态表与连续查询 1.1 动态表 1.是flink的支持流数据Table API 和SQL的核心概念。动态表随时间的变化而变化 2.在流上面定义的表在内部是没有数据的 1.2 连续查询 1.永远不会停止,结果是一张动态表 二 Flink SQL 2.1 sql行 1.先启动启动flink集群 yarn-see…...
C++|哈希应用->位图
目录 一、概念 1.1原理分析: 1.2效率分析: 二、模拟实现 2.1位图框架初始化空间 2.2映射 2.3清零 2.4判断 2.5测试代码 三、位图扩展应用 一、概念 位图,本质上也是一个数组,通过哈希思想构造的一种数据结构,…...
Rust 实战丨SSE(Server-Sent Events)
📌 SSE(Server-Sent Events)是一种允许服务器向客户端浏览器推送信息的技术。它是 HTML5 的一部分,专门用于建立一个单向的从服务器到客户端的通信连接。SSE的使用场景非常广泛,包括实时消息推送、实时通知更新等。 S…...
Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游ÿ…...
React基础教程:TodoList案例
todoList案例——增加 定义状态 // 定义状态state {list: ["kevin", "book", "paul"]}利用ul遍历list数组 <ul>{this.state.list.map(item ><li style{{fontWeight: "bold", fontSize: "20px"}} key{item.i…...
PHP超详细安装及应用
目录 所需安装包如下 一、PHP安装 依赖包安装 安装扩展工具(先将PHP所需的软件包全部拖进centos根目录下) 安装libmcrypt 安装mhash 安装mcrypt 安装PHP 二、设置LAMP组件环境(要保证mysql、http都安装完成了) Php.ini的建…...
【算法篇】大数加法JavaScript版
题目描述 以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。 数据范围:s.length,t.length≤100000,字符串仅由’0’~‘9’构成 要求:时间复杂度 𝑂(𝑛) 示例1 输入&…...
【LeetCode 128】 最长连续子序列
判断前一位数在不在字典中是这道题的关键之处,这样就可以避免重复查找,从而达到O(n) 的时间复杂度。如果没有这个判断,那么时间复杂度最坏也得是O(N^2)级别的。 1. 题目 2. 分析 合理利用数据结构。本题中使用了set来保存数组的元素&#x…...
SpringCloud-面试篇(二十六)
(1)Sentinel核心API-ProcessorslotChain...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

