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

news2024/11/23 3:14:29
推荐:使用 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)

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

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

相关文章

python_面向对象基础_数据分析

主要目的 对于文本格式和JSON格式数据进行分析,将其中数据提炼出来绘制折线图。 主要实现步骤 1.设计一个完成对数据的封装 2.设计一个抽象类,定义数据读取相关功能,使用其子类实现具体功能 3.读取文件,生成数据对象 4.进行数据计算 5.绘制图表 定义数据封装类 &…

Annotorious.js 入门教程:图片注释工具

theme: smartblue 本文简介 【今天我必须发一个封面!放文末!】 最近有工友问我前端怎么给图片做标注。使用 Fabric.js 或者 Konva.js 等库确实可以实现,但多少觉得有点大炮打蚊的感觉,好奇有没有专门做图片标注的工具呢&#xff1…

剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 实现函数 double Power(double base, int exponent),求base的exponent次方。 注意&#xff1…

stm32项目(5)——基于stm32的工地噪声扬尘检测系统

目录 1.功能设计 2.硬件方案 1.单片机选择 2.声音传感器 3.PM2.5传感器 4.显示器 3.程序设计 4.课题意义 1.功能设计 本次系统实现的功能如下所示: 采用声音传感器检测环境噪音,采用PM2.5传感器检测环境灰尘浓度。若噪声超过阈值或者PM2.5超过阈…

ROS Navigation Stack安装

Navigation导航包是做导航几乎都要用的,大家可以先去ROS Wiki上学习下 我们先Git下对应版本的软件包,我是Kinetic的,所以是Kinetic-devel 下载后发现目录下并没有CMakeLists.txt,所以直接在ROS工作目录下catkin_make并不会产生可…

【FPGA】UART串口通信——奇偶校验实现

文章目录 一、奇偶校验位二、设计思路三、仿真测试 一、奇偶校验位 奇偶校验位是基于uart的数据上进行一个判断 奇校验:数据1个数为奇时,校验为0,反之为1 偶校验:数据0个数为偶时,校验为0,反之为1 Uart…

MySQL 事务原理:事务概述、隔离级别、MVCC

文章目录 一、事务1.1 事务概述1.2 事务控制语句1.3 ACID特性 二、隔离级别2.1 隔离级别的分类2.1.1 读未提交(RU)2.1.2 读已提交(RC)2.1.3 可重复读(RR)2.1.4 串行化 2.2 命令2.3 并发读异常2.3.1 脏读2.3…

Babylon.js着色器简明简称【Shader】

推荐:用 NSDT设计器 快速搭建可编程3D场景 为了生成 BabylonJS 场景,需要用 Javascript 编写代码,BabylonJS 引擎会处理该代码并将结果显示在屏幕上。 场景可以通过改变网格、灯光或摄像机位置来改变。 为了及时显示可能的变化,屏…

借助gopsutil库,获取机器相关信息

使用github.com/shirou/gopsutil/disk这个库,如何获取机器下不同磁盘分区的内容 使用 github.com/shirou/gopsutil/disk 库获取机器下不同磁盘分区的内容,可按如下: import "github.com/shirou/gopsutil/disk"//调用 disk.Partitio…

【瑞吉外卖】Git部分学习

Git简介 Git是一个分布式版本控制工具,通常用来对软件开发过程中的源代码文件进行管理。通过Git仓库来存储和管理这些文件,Git仓库分为两种: 本地仓库:开发人员自己电脑上的Git仓库 远程仓库:远程服务器上的Git仓库…

git原理与使用

目录 引入基本操作分支管理远程操作标签管理 引入 假设你的老板要你设计一个文档,当你设计好了,拿给他看时,他并不是很满意,就要你拿回去修改,你修改完后,再给他看时,他还是不满意,…

ERP、APS、MES 三者之间的关系

ERP(Enterprise Resource Planning) APS(Advanced Planning and Scheduling) MES(Manufacturing Execution System) 这是三种不同类型的软件系统,它们主要用于企业内部管理和自动化运营流程。…

vscode Google代码风格设置无效解决

1. 采用第一个方法设置google代码设置风格 2. 安装了clangd后需要在格式化风格做选择 vscode 安装 clang-format插件 $ code /home/tony/.config/Code/User/settings.json 这就能解决google风格设置无效的问题了,原来根因在于使用的格式化插件没有生效导致&#xf…

还原某里226控制流混淆的思路

原两年前我就写出了还原控制流,由于当时没留笔记,导致现在很多忘记了,只记得大致思路,又由于在面试的时候,很多时候说不清楚,遂直接重构并还原最新版练手 另本文以教学为基准、本文提供的可操作性不得用于…

多用户跨境B2B2C商城后台管理系统快速搭建

搭建一个多用户跨境B2B2C商城后台管理系统需要考虑多个方面,包括系统架构设计、用户权限管理、商品管理、订单管理、支付管理、物流管理等。搭建步骤如下: 1. 系统架构设计 首先,需要设计一个稳定可靠的系统架构。选择一个适合B2B2C商城的商…

【iOS】RunLoop

前言-什么是RunLoop? 什么是RunLoop? 跑圈?字面上理解确实是这样的。 Apple官方文档这样解释RunLoop RunLoop是与线程息息相关的基本结构的一部分。RunLoop是一个调度任务和处理任务的事件循环。RunLoop的目的是为了在有工作的时候让线程忙起来&#…

谈谈对Spring MVC的理解

问题分析: SpringMVC 是一种基于 Java 语言开发,实现了 Web MVC 设计模式,请求驱动类型 的轻量级 Web 框架。 SpringMVC采用了 MVC 架构模式的思想,通过把 Model,View,Controller 分离,将 Web 层…

Kubeadm搭建 Kubernetes

kubeadm搭建整体步骤 1)所有节点进行初始化,安装docker引擎和kubeadm kubelet kubectl 2)生成集群初始化配置文件并进行修改 3)使用kubeadm init根据初始化配置文件生成K8S的master控制管理节点 4)安装CNI网络插件&am…

在centos7下通过docker 安装onlyoffice

因为需要调试网盘,所以今天安装一下centos7的onlyoffice 官方介绍如下: 为了方便,还是通过docker方式来安装onlyoffice了,这里我们采用社区版本了。 1、下载docker安装包 如下: docker pull onlyoffice/documentserv…

Mageia 9 RC1 正式发布,Mandriva Linux 发行版的社区分支

导读Mageia 9 首个 RC 已发布。公告写道,自 2023 年 5 月发布 beta 2 以来,Mageia 团队一直致力于解决许多顽固问题并提供安全修复和新特性。 新版本的控制中心添加了用于删除旧内核的新功能,该功能在 Mageia 9 中默认自动启用,用…