【SQL】使用索引的好处

使用索引可以显著加快查询速度,主要原因有以下几个方面:

1. 减少数据扫描量

索引类似于一本书的目录,可以让数据库快速找到特定的数据行,而不是从头到尾扫描整个表。例如,没有索引的情况下,查询 SELECT * FROM users WHERE username = 'Alice' 需要扫描表中的每一行,而有索引的情况下,数据库可以直接通过索引找到包含 ‘Alice’ 的行。

2. 提升数据检索效率

索引数据结构通常是树(例如 B 树或 B+ 树)或哈希表。这些数据结构有助于快速定位数据,特别是 B 树可以提供高效的范围查询和排序操作。例如,查询 SELECT * FROM orders WHERE order_date >= '2023-01-01' AND order_date <= '2023-06-30' 时,如果 order_date 有索引,数据库可以高效地找到符合条件的记录。

3. 减少 I/O 操作

使用索引可以减少磁盘 I/O 操作,因为索引通常比表数据小得多,查询索引所需的读取操作比查询整个表少得多。这在处理大表时尤为明显。例如,当我们执行查询 SELECT * FROM sales WHERE amount > 1000 时,有索引的情况下数据库可以直接读取包含 amount 列的索引部分,而无需读取整个表。

4. 优化 JOIN 操作

索引在连接操作中也非常有用。使用索引可以加速表之间的连接,特别是涉及外键的连接。例如,查询 SELECT * FROM orders o JOIN customers c ON o.customer_id = c.customer_id 时,如果 customer_id 列有索引,数据库可以快速找到匹配的记录。

示例:使用索引前后查询速度对比

假设有一个用户表 users,包含以下数据:

CREATE TABLE users (user_id INT PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL UNIQUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-- 插入大量数据
INSERT INTO users (user_id, username, email) VALUES
(1, 'Alice', 'alice@example.com'),
(2, 'Bob', 'bob@example.com'),
-- 假设有数百万行
(1000000, 'Zoe', 'zoe@example.com');

没有索引的查询

EXPLAIN SELECT * FROM users WHERE username = 'Alice';

结果可能显示全表扫描(Full Table Scan),即使只找到一个匹配的记录也需要扫描所有行。

创建索引

CREATE INDEX idx_username ON users (username);

使用索引的查询

EXPLAIN SELECT * FROM users WHERE username = 'Alice';

结果将显示使用了索引扫描(Index Scan),数据库通过索引直接定位到包含 username = 'Alice' 的记录,大大减少了扫描的行数和时间。

Java 示例:查询前后索引的使用

使用 Java 和 JDBC 来执行上述 SQL 操作,展示索引使用前后的查询时间对比:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;public class IndexExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/your_database";String user = "your_username";String password = "your_password";try (Connection connection = DriverManager.getConnection(url, user, password)) {// 查询没有索引的表long startTime = System.currentTimeMillis();String queryWithoutIndex = "SELECT * FROM users WHERE username = 'Alice'";try (PreparedStatement stmt = connection.prepareStatement(queryWithoutIndex);ResultSet rs = stmt.executeQuery()) {while (rs.next()) {System.out.println("User ID: " + rs.getInt("user_id") + ", Username: " + rs.getString("username"));}}long endTime = System.currentTimeMillis();System.out.println("Query without index took: " + (endTime - startTime) + "ms");// 创建索引String createIndexSQL = "CREATE INDEX idx_username ON users (username)";try (Statement stmt = connection.createStatement()) {stmt.executeUpdate(createIndexSQL);}// 查询使用索引的表startTime = System.currentTimeMillis();String queryWithIndex = "SELECT * FROM users WHERE username = 'Alice'";try (PreparedStatement stmt = connection.prepareStatement(queryWithIndex);ResultSet rs = stmt.executeQuery()) {while (rs.next()) {System.out.println("User ID: " + rs.getInt("user_id") + ", Username: " + rs.getString("username"));}}endTime = System.currentTimeMillis();System.out.println("Query with index took: " + (endTime - startTime) + "ms");} catch (Exception e) {e.printStackTrace();}}
}

这个例子展示了在 Java 中如何通过 JDBC 创建索引并执行查询,以对比索引前后的查询性能差异。使用索引后,查询时间显著减少,因为数据库能够更高效地定位数据。

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

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

相关文章

简洁版人工智能训练流程

人工智能&#xff08;AI&#xff09;训练流程是指使用数据来训练机器学习模型&#xff0c;使其能够执行特定任务的过程。以下是人工智能训练的一般流程&#xff1a; #mermaid-svg-qZ5c5PU9yms7cVOB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:…

Java中如何优雅地处理NamingException异常?

Java中如何优雅地处理NamingException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java开发中&#xff0c;NamingException异常是JNDI&…

鸿蒙arkts api9 图片验证码 canvas

/*** 图片验证码***/ Component export default struct RandomTxtCanvas {Link imgRandomTxt:string//图片验证private settings: RenderingContextSettings new RenderingContextSettings(true)private context: CanvasRenderingContext2D new CanvasRenderingContext2D(th…

DataWhaleAI Tsak1 运行Baseline

题目背景 在当今数字化时代&#xff0c;企业积累了丰富的对话数据&#xff0c;这些数据不仅是客户与企业之间交流的记录&#xff0c;更是隐藏着宝贵信息的宝库。在这个背景下&#xff0c;群聊对话分角色要素提取成为了企业营销和服务的一项重要策略。 群聊对话分角色要素提取…

nlp--最大匹配分词(计算召回率)

最大匹配算法是一种常见的中文分词算法&#xff0c;其核心思想是从左向右取词&#xff0c;以词典中最长的词为优先匹配。这里我将为你展示一个简单的最大匹配分词算法的实现&#xff0c;并结合输入任意句子、显示分词结果以及计算分词召回率。 代码 : # happy coding…

Tektronix泰克 AWG70001A 任意波形发生器

Tektronix泰克 AWG70001A 任意波形发生器 AWG70000A 系列任意波形发生器 (AWG) 在采样率、信号保真度和波形内存方面代表着尖端水平&#xff0c;特别适合复杂器件、系统和实验的设计、测试和操作。由于高达 50 GS/s 采样率和 10 位垂直分辨率&#xff0c;它提供了优秀的信号激…

【Python】入门Python,你必须了解这些事

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言一、认识Python什么是Python&#xff1f;!Python的起源Python的特点简洁易读跨平台&#xff0c;可移植拥有强大的库和框架面向对象 Python的优缺点优点缺点 Python的应用环境扩…

linux ls文件排序

linux可以使用ls命令结合一些选项来按照文件大小对文件和目录进行排序。以下是一些常用的方法&#xff1a; 1、这里&#xff0c;-l 选项表示长格式输出&#xff08;包括文件权限、所有者、大小等&#xff09;&#xff0c;-S 选项表示按照文件大小排序&#xff0c;-h 选项表示以…

PHP留守儿童关爱之家网站-计算机毕业设计源码11079

目录 1 绪论 1.1 研究背景 1.2研究意义 1.3 论文结构与章节安排 2 留守儿童关爱之家网站系统分析 2.1 可行性分析 2.2 系统功能分析 2.3 系统用例分析 2.4 系统流程和逻辑 2.5本章小结 3 留守儿童关爱之家网站总体设计 3.1系统结构设计 3.2系统功能模块设计 3.2 数…

【算法训练记录——Day38】

Day38——动态规划Ⅰ 1.理论#2.leetcode_509斐波那契数3.leetcode_70爬楼梯4.kamacoder_57爬楼梯5.leetcode_746使用最小花费爬楼梯 1.理论 一般解题步骤&#xff1a; 确定dp数组及下标含义确定递推公式数组如何初始化确定递归顺序举例推导dp数组 #2.leetcode_509斐波那契数…

阿里云物联网应用层开发:第一部分,项目简介

文章目录 1、物联网应用层简介2、阿里云物联网应用层开发例程主要内容3、需要掌握基础知识 1、物联网应用层简介 应用层是物联网系统的用户界面&#xff0c;它提供了用户与系统交互的接口&#xff0c;这一层是将网络传输层的数据结果以易于理解和使用的方式呈现给用户&#xf…

vue3 Hooks 函数封装思想 useTable

1.什么是Hooks 1.一系列已use作为开头的方法&#xff0c;它们提供了可以完全避开class写法&#xff0c;在函数组件中完成生命周期 状态管理 逻辑复用等几乎全部的组件开发工作能力 2.Hooks最核心的价值来着内部的状态管理 3. 在vue3中&#xff0c;hooks的概念结合了vue的响应系…

linux虚拟机部署的MySQL如何使用外网访问?教你轻松使用cpolar在centos搭建内网穿透

文章目录 写在前面实现Linux的内网穿透1、官网账号注册2、在Linux部署我们自己的项目3、一键自动下载安装cpolar4、设置自己的token5、启动cpolar服务6、MySQL穿透测试 卸载方法 写在前面 相信很多小伙伴在本地搭建了一个MySQL数据库&#xff0c;想让其他同事或者合作者一起使…

BCFtools安装

记得之前安装这个软件的时候是非常简单的&#xff0c;但是今天重新安装的时候出现了很多的麻烦&#xff0c;想想还是做个记录吧! bcftools的下载地址如下&#xff1a; Releases samtools/bcftools (github.com)https://github.com/samtools/bcftools/releases/这里我们选用的…

力扣523.连续的子数组和

力扣523.连续的子数组和 哈希表记录下标 class Solution {public:bool checkSubarraySum(vector<int>& nums, int k) {//初始化 方便求余数为0的情况unordered_map<int,int> cnt {{0,-1}};int idx0;for(int i0;i<nums.size();i){idx (idx nums[i]) % …

网络安全 文件上传漏洞-21 upload-labs通过全部关卡

通过全部关卡后对 upload-labs实验环境中 文件上传做一个总结&#xff1a;实验环境中文件上传主要分为黑名单、白名单、读取检查文件类型、删除文件几个类型&#xff0c;针对不同的类型可以使用不同的方式绕过&#xff0c;从而上传木马文件&#xff1a; 黑名单验证 如果是黑名…

【数据结构】(C语言):队列

队列&#xff1a; 线性的集合。先进先出&#xff08;FIFO&#xff0c;first in first out&#xff09;。两个指针&#xff1a;头指针&#xff08;指向第一个进入且第一个出去的元素&#xff09;&#xff0c;尾指针&#xff08;指向最后一个进入且最后一个出去的元素&#xff0…

Linux CentOS 7 离线安装.NET环境

下载 下载.NET 例如&#xff1a; aspnetcore-runtime-6.0.15-linux-x64.tar.gz 复制 复制到如下目录&#xff1a; /usr/local/dotnet/aspnetcore-runtime-6.0.15-linux-x64.tar.gz 解压 cd /usr/local/dotnet/ tar -zxvf aspnetcore-runtime-6.0.15-linux-x64.tar.gz 创建…

Linux开发讲课29---Linux USB 设备驱动模型

Linux 内核源码&#xff1a;include\linux\usb.h Linux 内核源码&#xff1a;drivers\hid\usbhid\usbmouse.c 1. BUS/DEV/DRV 模型 "USB 接口"是逻辑上的 USB 设备&#xff0c;编写的 usb_driver 驱动程序&#xff0c;支持的是"USB 接口"&#xff1a; US…

http.cookiejar.LoadError: Cookies file must be Netscape formatted,not JSON.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…