sql的索引与性能优化相关
之前面试的时候,由于在简历上提到优化sql代码,老是会被问到sql索引和性能优化问题,用这个帖子学习记录一下。
1.为什么要用索引
-------------------------------------------------------------------------------------------------------------------
想象一下,你在一个超级大的图书馆里找一本书。图书馆有数百万本书,而这些书按类别和作者名字乱七八糟地堆放在各个角落。你需要找一本特定的书,比如《哈利·波特与魔法石》。如果没有任何排序规则,你就只能从最前面一排一排地看书,直到找到你要的书,这样的查找过程非常慢,对吧?而且,如果书很多,查找起来就像大海捞针一样困难。
现在,假设图书馆给每本书都加上了“书名索引”——它将每本书的书名按字母顺序排列成一张目录。这时,如果你想找《哈利·波特与魔法石》,你只需要翻看目录,迅速定位到“H”的位置,接着直接找到那本书,速度快得多了。
这个目录就像数据库中的索引。
------------------------------------------------------------------------------------------------------------------
为什么用索引?
1. 提高查询效率:
没有索引的情况下,数据库就像你在没有书名索引的图书馆里找书一样。查询时,数据库需要全表扫描,逐行检查每条记录,像从头到尾翻看每本书一样。对于大表(比如数据量上百万、上千万的表),这种做法非常慢,尤其在复杂的查询时,效率低下。
举个例子:
假设我们有一个包含百万条数据的表:Customers
表,每条数据记录一个客户的姓名、联系方式等信息。现在,我们执行一个查询:
SELECT * FROM Customers WHERE CustomerName = 'John Doe';
如果没有索引,数据库就需要检查每一行数据,查找匹配的记录。这就像在没有索引的图书馆里,逐本翻书找《John Doe》的资料一样,效率极低。
2. 通过索引加速查询:
如果你为 CustomerName
列创建了索引,就像为图书馆建立了一个目录表(查找表),所有的客户名字按字母顺序排列。当你查询 CustomerName = 'John Doe'
时,数据库会直接跳到字母 "J" 的位置,迅速定位到包含 John Doe
的记录,而无需扫描整个表。
CREATE INDEX idx_customer_name ON Customers (CustomerName);
当执行以下查询时:
SELECT * FROM Customers WHERE CustomerName = 'John Doe';
数据库就像翻开目录快速定位到John Doe
的位置,避免了逐行扫描所有数据,查询速度大大提高。
3. 避免全表扫描的影响:
没有索引时,查询变得非常低效,特别是对于大表。假设 Customers
表有上千万条记录,每次查询时都需要扫描整个表,执行的时间可能需要几秒钟甚至几分钟。而如果表有索引,这个过程就像使用目录快速定位书籍,数据库能在毫秒级时间内找到结果。
---------------------------------------------------------------------------------------------------------------------
2.sql索引原理和演化过程
首先是二分树法查找
普通的二叉树的缺点:新的数据节点有可能一直插入同一边,甚至形成一个链表:
作为改进,平衡二叉树出现了。
平衡二叉树的缺点是:数据量增大的话,这棵平衡二叉树就会变得很高,一次查询需要多次IO操作。
然后是B树:
B树相比于之前的二叉树,一个节点可以存储多个数据,并按序排列。而且B树也可以开超过2个的分叉,使得这棵树更加扁平化,也就需要更少的IO操作。(有序排列的树配合二分法)
B树也有一些缺点:1.查找性能不够稳定 2.不适合做范围查找
作为B树增强版,B+树出现了
可以看到只有最下面一层节点存储数据,之前上面的节点可以用来多存储指向其他节点的指针,中间节点可以分更多叉,整棵树变得更扁平,也减少IO次数。
最后再把叶子节点用指针连接起来,解决范围查询的问题。
--------------------------------------------------------------------------------------------------------------
3.索引与性能优化
之前说过了合理运用索引,能提高查找效率,下面是五个利用索引联系起性能优化的例子,利用EXPLAIN关键字来看select语句的性能(type)。
type
等级的顺序从高到低是:
const
(最优)eq_ref
ref
range
index
ALL
(最差)
(1)对索引执行函数或计算会变成全表查找,即type=all降低效率。
可以看到type是all,最差的。
可以进行以下修改,提高查找效率。
(2)联合索引,排序不影响效率。
(3)索引前后顺序,单独使用后索引是无效索引查询即type=all。
可以改一下复合索引顺序,col2放前面。
(4)模糊匹配,前面值确不确定影响是否是索引查询,即type=range/all,比如即ike语句的前导模糊查询不能使用索引。
(5) 查询条件增加,结果精确,但超出索引范围,会using where。即索引覆盖效率快于回表查询。
---------------------------------------------------------------------------------
4.外键相关
外键(Foreign Key)是数据库中的一种约束,用于确保表与表之间的参照完整性。它确保从表中的某个字段值必须在主表中有对应的有效记录。
外键的作用:
- 数据一致性:外键保证从表中的数据引用主表中存在的有效数据,防止无效或错误的数据被插入。
- 表间关系:通过外键,表与表之间建立关联,常见的一对多关系、父子关系等。
- 防止孤立数据:外键还可以设置级联操作,确保删除或更新主表记录时,从表的数据被适当处理。
外键的基本概念:
- 主表:包含唯一标识(如主键)的表。
- 从表:引用主表主键或唯一字段的表。
外键的约束:
- 级联操作(CASCADE):删除或更新主表记录时,自动删除或更新从表相关的记录。
- 限制删除(RESTRICT):如果主表中的记录被引用,拒绝删除主表记录。
- 置空(SET NULL):删除或更新主表记录时,将从表中相关的外键字段置为 NULL。
相关文章:

sql的索引与性能优化相关
之前面试的时候,由于在简历上提到优化sql代码,老是会被问到sql索引和性能优化问题,用这个帖子学习记录一下。 1.为什么要用索引 ------------------------------------------------------------------------------------------------------…...

【Git版本控制器】第四弹——分支管理,合并冲突,--no-ff,git stash
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 相关笔记: https://blog.csdn.net/djd…...
Elasticsearch除了用作查找以外,还能可以做什么?
前言 Elasticsearch用于实时数据分析、日志存储、业务智能等。还有日志与监控、多租户和安全性。以及应用场景包括日志分析、公共数据采集、全文搜索、事件数据、数据可视化。处理错误拼写和支持变体,不过这些可能还是属于搜索优化。企业搜索、日志管理、应用监控、…...
Gradio全解11——使用transformers.agents构建Gradio UI(6)
大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(6) 前言本篇摘要11. 使用transformers.agents构建Gradio UI11.6 通过agents构建Gradio UI11.6.1 ChatMessage数据类1. 数据结构2. 例程11.6.2 构建Gradio UI示例1. 代码及运行2. 代码解读参考文献前言 本…...
自定义实现简版状态机
状态机(State Machine)是一种用于描述系统行为的数学模型,广泛应用于计算机科学、工程和自动化等领域。它通过定义系统的状态、事件和转移来模拟系统的动态行为。 基本概念 状态(State):系统在某一时刻的特…...

算法常见八股问题整理
1.极大似然估计和交叉熵有什么关系 在分类问题中,当我们使用softmax函数作为输出层时,最大化对数似然函数实际上等价于最小化交叉熵损失函数。具体来说,在多分类情况下,最大化该样本的对数似然等价于最小化该样本的交叉熵损失。 交…...
关于GeoPandas库
geopandas buildings gpd.read_file(shapefile_path) GeoDataFrame 对象有一个属性叫做 sindex 空间索引通常是基于 R-树 或其变体构建的,这些数据结构专为空间查询优化,可以显著提高查询效率,尤其是在处理大型数据集时。 buildings_sin…...

【漫话机器学习系列】103.学习曲线(Learning Curve)
学习曲线(Learning Curve)详解 1. 什么是学习曲线? 学习曲线(Learning Curve)是机器学习和深度学习领域中用于评估模型性能随训练过程变化的图示。它通常用于分析模型的学习能力、是否存在过拟合或欠拟合等问题。 从…...

电商运营中私域流量的转化与变现:以开源AI智能名片2+1链动模式S2B2C商城小程序为例
摘要 电商运营的核心目标在于高效地将产品推向市场,实现私域流量的转化和变现。本文以“罗辑思维”的电商实践为背景,探讨了私域流量变现的重要性,并深入分析了开源AI智能名片21链动模式S2B2C商城小程序在电商运营中的应用与价值。通过该模式…...
Python常见面试题的详解19
1. 如何使用Django 中间件 Django 中间件宛如一个灵活且强大的插件系统,它为开发者提供了在请求处理流程的不同关键节点插入自定义代码的能力。这些节点包括请求抵达视图之前、视图完成处理之后以及响应即将返回给客户端之前。借助中间件,我们可以实现诸…...
Python 数据类型转换
目录 整数(int)与浮点数(float)之间的转换 (1)int():将浮点数或字符串转换为整数 (2)float():将整数或字符串转换为浮点数 字符串(str…...

进程概念、PCB及进程查看
文章目录 一.进程的概念进程控制块(PCB) 二.进程查看通过指令查看进程通过proc目录查看进程的cwd和exe获取进程pid和ppid通过fork()创建子进程 一.进程的概念 进程是一个运行起来的程序,而程序是存放在磁盘的,cpu要想执行程序的指…...
PyEcharts 数据可视化:从入门到实战
一、PyEcharts 简介 PyEcharts 是基于百度开源可视化库 ECharts 的 Python 数据可视化工具,支持生成交互式的 HTML 格式图表。相较于 Matplotlib 等静态图表库,PyEcharts 具有以下优势: 丰富的图表类型(30)动态交互功…...

RT-Thread+STM32L475VET6——ADC采集电压
文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟,并修改时钟树1.2 打开ADC1的通道3,并配置为连续采集模式(ADC根据自己需求调整)1.3 打开串口1.4 生成工程 2. 配置ADC2.1 打开ADC驱动2.2 声明ADC2.3 剪切stm…...

easyexcel 2.2.6版本导出excel模板时,标题带下拉框及其下拉值过多不显示问题
需求背景:有一个需求要做下拉框的值有100多条,同时这个excel是一个多sheet的导入模板 直接用easyexcel 导出,会出现下拉框的值过多,导致生成出来的excel模板无法正常展示下拉功能 使用的easyexcel版本:<depende…...

树(数据结构·)
树(数据结构篇) 里面没有结点时,称之为空树 树型结构是一对多的形式 深度优先遍历: 所谓的DFS,也就是说每次都尝试向更深的节点走,也就是一条路走到黑 当一条路走完,走到…...
XUnity.AutoTranslator-deepseek——调用腾讯的DeepSeek V3 API,实现Unity游戏中日文文本的自动翻译
XUnity.AutoTranslator-deepseek 本项目通过调用腾讯的DeepSeek V3 API,实现Unity游戏中日文文本的自动翻译。 准备工作 1. 获取API密钥 访问腾讯云API控制台申请DeepSeek的API密钥(限时免费)。也可以使用其他平台提供的DeepSeek API。 …...

谈谈 ES 6.8 到 7.10 的功能变迁(1)- 性能优化篇
前言 ES 7.10 可能是现在比较常见的 ES 版本。但是对于一些相迭代比较慢的早期业务系统来说,ES 6.8 是一个名副其实的“钉子户”。 借着工作内升级调研的任务东风,我整理从 ES 6.8 到 ES 7.10 ELastic 重点列出的新增功能和优化内容。将分为 6 个篇幅给…...

[250222] Kimi Latest 模型发布:尝鲜最新特性与追求稳定性的平衡 | SQLPage v0.33 发布
目录 Kimi Latest 模型发布:尝鲜最新特性与追求稳定性的平衡SQLPage v0.33 发布:使用 SQL 构建自定义 UI 和 API! Kimi Latest 模型发布:尝鲜最新特性与追求稳定性的平衡 Kimi 开放平台推出全新模型 kimi-latest,旨在…...
深入理解设计模式之解释器模式
深入理解设计模式之解释器模式 在软件开发的复杂世界中,我们常常会遇到需要处理特定领域语言的情况。比如在开发一个计算器程序时,需要解析和计算数学表达式;在实现正则表达式功能时,要解析用户输入的正则表达式来匹配文本。这些场景都涉及到对特定语言的解释和执行,而解…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...