数据库优化:探索 SQL 中的索引

推荐:使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景

在一本书中搜索特定主题时,我们将首先访问索引页面(该页面位于该书的开头),并找到包含我们感兴趣的主题的页码。现在,想象一下在没有索引页的书中找到特定主题是多么不方便。为此,我们必须搜索书中的每一页,这非常耗时且令人沮丧。

当 SQL Server 从数据库中检索数据时,它也会出现类似的问题。为了克服这个问题,SQL Server还使用索引来加快数据检索过程,在本文中,我们将介绍该部分。我们将介绍为什么需要索引以及如何有效地创建和删除索引。本教程的先决条件是 SQL 命令的基本知识。

什么是索引?

索引是一个架构对象,它使用指针从行中检索数据,从而减少查找数据的 I/O(输入/输出)时间。索引可以应用于我们要搜索的一个或多个列。它们将列存储在称为 B 树的单独数据结构中。B-Tree的主要优点之一是它以排序顺序存储数据。

如果您想知道为什么如果对数据进行排序可以更快地检索数据,那么您必须阅读线性搜索与二分搜索。

索引是提高 SQL 查询性能的最著名的方法之一。它们体积小、速度快,并且针对关系表进行了显著优化。当我们想要搜索没有索引的行时,SQL 会线性执行全表扫描。换句话说,SQL必须扫描每一行才能找到匹配条件,这是非常耗时的。另一方面,如上所述,索引使数据保持排序。

但是我们也应该小心,索引会创建一个单独的数据结构,这需要额外的空间,当数据库很大时,这可能会成为问题。出于良好做法,索引仅对常用列有效,可以避免对很少使用的列使用。以下是索引编制可能有用的一些情况,

  1. 行数必须为 (>10000)。
  2. 必需列包含大量值。
  3. 必需的列不得包含大量 NULL 值。
  4. 如果我们经常根据特定列对数据进行排序或分组,这将很有帮助。索引快速检索排序后的数据,而不是执行完全扫描。

在以下情况下可以避免索引,

  1. 桌子很小。
  2. 或者当列的值很少使用时。
  3. 或者当列的值频繁更改时。

当优化程序检测到全表扫描花费的时间少于索引表时,也可能不使用索引,即使它存在也是如此。当表较小或列频繁更新时,可能会发生这种情况。

创建示例数据库

在开始之前,您必须在PC上设置MySQL工作台才能轻松遵循本教程。您可以参考此YouTube视频来设置工作台。

设置工作台后,我们将创建一些随机数据,从中可以执行查询。

创建表:

-- Create a table to hold the random data

CREATE TABLE employee_info (id INT PRIMARY KEY AUTO_INCREMENT,
                                               name VARCHAR(100),
                                                    age INT, email VARCHAR(100));

插入数据:

-- Insert random data into the table

INSERT INTO employee_info (name, age, email)
SELECT CONCAT('User', LPAD(ROW_NUMBER() OVER (), 5, '0')),
       FLOOR(RAND() * 50) + 20,
       CONCAT('user', LPAD(ROW_NUMBER() OVER (), 5, '0'), '@xyz.com')
FROM information_schema.tables
LIMIT 100;

它将创建一个名为具有名称、年龄和电子邮件等属性的表。employee_info

显示数据:

SELECT *
FROM employee_info;

输出:

数据库优化:探索 SQL 中的索引

创建和删除索引

为了创建索引,我们可以像这样使用 CREATE 命令,

语法:

CREATE INDEX index_name ON TABLE_NAME (COLUMN_NAME);

在上面的查询中,是索引的名称,是表的名称,是我们要应用索引的列的名称。index_nametable_namecolumn_name

前任-

CREATE INDEX age_index ON employee_info (age);

我们还可以为同一表中的多列创建索引,

CREATE INDEX index_name ON TABLE_NAME (col1,
                                       col2,
                                       col3, ....);

唯一索引: 我们还可以为特定列创建一个唯一索引,该索引不允许在该列中存储重复值。这样可以保持数据的完整性,并进一步提高性能。

CREATE UNIQUE INDEX index_name ON TABLE_NAME (COLUMN_NAME);

注意: 可以为PRIMARY_KEY和 UNIQUE 列自动创建索引。我们不必手动创建它们。

删除索引:

我们可以使用 DROP 命令从表中删除特定索引。

DROP INDEX index_name ON TABLE_NAME;

我们需要指定索引和表名来删除索引。

显示索引:

您还可以查看表中存在的所有索引。

语法:

SHOW INDEX
FROM TABLE_NAME;

前任-

SHOW INDEX
FROM employee_info;

输出:

数据库优化:探索 SQL 中的索引

更新索引

以下命令在现有表中创建新索引。

语法:

ALTER TABLE TABLE_NAME ADD INDEX index_name (col1, col2, col3, ...);

注意: ALTER 不是 ANSI SQL 的标准命令。因此,它可能因其他数据库而异。

例如

ALTER TABLE employee_info ADD INDEX name_index (name);

SHOW INDEX
FROM employee_info;

输出:

数据库优化:探索 SQL 中的索引

在上面的示例中,我们在现有表中创建了一个新索引。但是我们不能修改现有的索引。为此,我们必须首先删除旧索引,然后创建一个新的修改索引。

例如

DROP INDEX name_index ON employee_info;


CREATE INDEX name_index ON employee_info (name, email);

SHOW INDEX
FROM employee_info ;

输出:

数据库优化:探索 SQL 中的索引

总结

在本文中,我们介绍了对 SQL 索引的基本了解。还建议保持索引范围较窄,即限制为几列,因为更多的索引可能会对性能产生负面影响。索引加快了 SELECT 查询和 WHERE 子句的速度,但减慢了插入和更新语句的速度。因此,仅对常用列应用索引是一种很好的做法。

在那之前,继续阅读并继续学习。

原文链接:数据库优化:探索 SQL 中的索引 (mvrlink.com)

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

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

相关文章

pycharm离线安装依赖包

一、对于单个下载离线包,然后安装 1、先去https://pypi.org/网站下载离线包,下载到本地; 2、从磁盘中找到刚刚下载包,点击确定就可以安装了 二、将本地项目所有依赖包全部下载下来,然后批量在另一个项目&#xff…

Pytorch Tutorial【Chapter 2. Autograd】

Pytorch Tutorial 文章目录 Pytorch TutorialChapter 2. Autograd1. Review Matrix Calculus1.1 Definition向量对向量求导1.2 Definition标量对向量求导1.3 Definition标量对矩阵求导 2.关于autograd的说明3. grad的计算3.1 Manual手动计算3.2 backward()自动计算 Reference C…

ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决

ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决 这个问题出现在使用Kyubi Spark Util处理ParallelCollectionRDD的过程中,具体是在KyubiSparkUtil.scala文件的第48行调用isEmpty方法时出现的。该问题可能是由以下几个原因引起的&#xff1…

springboot(4)

AOP 1.AOP与OOP OOP(Object Oriented Programming,面向对象编程) AOP(Aspect Oriented Programming,面向切面编程) POP(Process Oriented Programming,面向过程编程) …

IPC之二:使用命名管道(FIFO)进行进程间通信的例子

IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,本文主要介绍命名管道(FIFO),命名管道可以完成同一台计算机上的进程之间的通信,本文给出了多个具体的实例,每个实例均附有完整的源代码;本文所有实例在 …

Pytest测试框架搭建的关键6个知识点(建议收藏)

在现代软件开发中,测试是确保代码质量和功能稳定性的关键步骤。而Pytest作为一个功能强大且易于使用的Python测试框架,为我们提供了一个优雅的方式来编写和管理测试。本文将为你介绍如何构建高效可靠的测试环境,着重探讨Pytest测试框架搭建时…

java 版本企业招标投标管理系统源码+多个行业+tbms+及时准确+全程电子化tbms

​ 功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查…

数据结构—树和二叉树

5.树和二叉树 5.1树和二叉树的定义 树形结构(非线性结构):结点之间有分支,具有层次关系。 5.1.1树的定义 树(Tree)是n(n≥0)个结点的有限集。 若n0,称为空树&#x…

文件传输软件的市场现状和未来趋势

文件传输软件是一种能够在不同计算机之间高效、便捷、安全地传送各种类型的文件的应用软件。它是计算机领域中的一项重要技术,涉及到网络通信、数据加密、文件管理等多个方面。随着互联网和移动互联网的发展,文件传输软件的市场需求也日益增大&#xff0…

Linux 中使用 verdaccio 搭建私有npm 服务器

安装 Node Linux中安装Node 安装verdaccio npm i -g verdaccio安装完成 输入verdaccio,出现下面信息代表安装成功,同时输入verdaccio后verdaccio已经处于运行状态,当然这种启动时暂时的,我们需要通过pm2让verdaccio服务常驻 ygiZ2zec61wsg…

iPhone苹果手机地震预警功能怎么开启?

iPhone苹果手机地震预警功能怎么开启? 1、打开iPhone苹果手机设置; 2、在iPhone苹果手机设置内找到辅助功能; 3、在辅助功能内找到触控; 4、在iPhone苹果手机辅助功能触控内找到振动,如果是关闭状态请启; …

看门狗文章

1. iwdg.c #include "stm32f4xx.h" #include "iwdg.h"//prer:预分频值 //rlr:自动重装载值 void IWDG_Init(unsigned char prer,unsigned int rlr)//IWDG初始化 {IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);…

你知道音频文件格式转换要用什么软件吗?今天就来分享给你

你是否曾经遇到过这样的情况?你正在享受着一首心爱的歌曲,却突然发现它的音频格式不兼容你的设备或播放器?或者你需要将录音文件从一种格式转换成另一种,以便在不同场景中使用?音频格式转换软件就像是一个通向音乐自由…

林大数据结构【2019】

关键字: 哈夫曼树权值最小、哈夫曼编码、邻接矩阵时间复杂度、二叉树后序遍历、二叉排序树最差时间复杂度、非连通无向图顶点数(完全图)、带双亲的孩子链表、平衡二叉树调整、AOE网关键路径 一、判断 二、单选 三、填空 四、应用题 五、算…

Windows搭建Snort环境及使用方式

目录 0x01 前置环境0x02修改配置文件0x03 自测0x04 使用0x05 感言 0x01 前置环境 环境描述windows10snort2.9.2https://www.snort.org/downloads 先把上面环境下载好! 需要注意的是安装npcap这个软件 0x02修改配置文件 软件安装目录:C:/Snort/ 配置文…

视频添加字幕

1、依靠ffmpeg 命令 package zimu;import java.io.IOException;public class TestSrt {public static void main(String[] args) {String videoFile "/test/test1.mp4";String subtitleFile "/test/test1.SRT";String outputFile "/test/testout13…

dy六神参数记录分析(立秋篇)

version: 23.9 X-SSSTUB: 搜索:x-tt-dt var hashMap Java.use("java.util.HashMap");hashMap.put.implementation function (a, b) {console.log("hashMap.put: ", a, b);return this.put(a, b);}https://codeooo.blog.csdn.n…

河北泛域名https证书可以保护几个域名

什么是泛域名https证书呢?在众多https证书产品中总有几种特别的https证书——泛域名https证书、多域名https证书。通常一张https证书只能保护一个站点,如果想保护多个站点,只能一次给各个站点购买https证书,这种做法虽然解决了问题…

华为云Classroom赋能—TooKit助力开发者上云

对于资深程序员而言,IDE是必不可少的,它好比是剑客手中的宝剑,IDE帮助程序员更快更丝滑的去编程,同时插件就是这把剑上的各种Buff,为宝剑赋能,提供更好的升级打怪体验。 什么是Huawei Cloud Toolkit Huaw…

STDF - 基于 Svelte 和 Tailwind CSS 打造的移动 web UI 组件库,Svelte 生态里不可多得的优秀项目

Svelte 是一个新兴的前端框架,组件库不多,今天介绍一款 Svelte 移动端的组件库。 关于 STDF STDF 是一个移动端的 UI 组件库,主要用来开发移动端 web 应用。和我之前介绍的很多 Vue 组件库不一样,STDF 是基于近来新晋 js 框架 S…