索引的使用以及使用索引优化sql

索引就是一种快速查询和检索数据的数据结构,mysql中的索引结构有:B+树和Hash。

索引的作用就相当于目录的作用,我么只需先去目录里面查找字的位置,然后回家诶翻到那一页就行了,这样查找非常快,

一、索引的使用 

创建一个表结构:

CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50),age INT,email VARCHAR(50)
);

1. 单列索引的创建与使用

场景:查询用户的年龄

我们需要查询某个年龄段的用户,如age = 30

-- 创建单列索引

-- 创建索引用index关键字
create index idx_age on users(age);

-- 使用索引查询,

-- 直接查询已经设置索引的关键字age:
SELECT * FROM users WHERE age = 30;

-- 效果: 当在age列上建立索引后,数据库不再进行全表扫描,而是通过索引快速找到匹配的记录。

2. 唯一索引的创建与使用

场景:确保电子邮件唯一

在用户表中,要求email字段的值唯一。

使用unique Index 关键字创建唯一索引,确保被创建的字段唯一值。

CREATE UNIQUE INDEX idx_email ON users(email);

-- 插入示例

 INSERT INTO users (id, name, age, email) VALUES (102, 'Alice', 25, 'bob@example.com');
INSERT INTO users (id, name, age, email) VALUES (103, 'Bob', 30, 'bob@example.com');

插入设置有唯一索引的列,如果插入的是重复的值的话会提示报错。

3. 复合索引的创建与使用

场景:按姓名和年龄组合查询用户

我们需要查询姓名为Tom且年龄为25的用户。

创建复合索引:

创建复合索引
create  index indexNameAndAge on users(name,age);

-- 使用复合索引将两个复合索引创建的列用and关联查询条件即可

SELECT * FROM users WHERE name = 'Diana Bell' AND age = 36;
注意事项 :最左前缀原则:
  • 查询name = 'Diana Bell'时,复合索引依然有效。
  • 但如果只查询age = 36,则索引无法使用。

 4. 删除和查看索引

删除索引:

DROP INDEX idx_age ON users;

查看表中的索引:

SHOW INDEX FROM users;

二、如何使用索引提高查询性能

1. ORDER BY 优化使用索引,GROUP BY也可以使用

场景:按用户年龄排序

对用户的年龄进行升序排序。

SELECT * FROM users ORDER BY age;

索引优化:age列上建立索引,可以避免排序时的全表扫描。

CREATE INDEX idx_age ON users(age);

 在需要排序或者分组的字段列上建立索引,可以避免排序时的全表扫描,提高查询效率。

2. 避免在索引列使用函数

场景:按创建时间查询

假设我们有一个用户注册时间的字段create_time

错误示例: 使用YEAR函数查询注册年份为2023的用户。

SELECT * FROM users WHERE YEAR(create_time) = 2023;

3. 使用 explain 分析索引使用情况

在优化SQL时,可以使用EXPLAIN查看查询的执行计划,判断索引是否生效。

explain SELECT * from users WHERE email='hannah.montana@example.com';

 type:如果为ALL,说明是全表扫描。

  key:表示查询使用了哪个索引。

4. 使用覆盖索引

场景:只查询用户的姓名和年龄

假设我们经常查询用户的nameage,希望加快查询速度。

CREATE INDEX idx_name_age_cover ON users(name, age);

使用覆盖索引的查询:

SELECT name, age FROM users WHERE age = 25;

覆盖索引效果: 因为nameage列已经包含在索引中,不需要再访问表的数据页(避免回表),提高查询性能。查询语句所需的列都包含在了创建的索引中,不需要再去查询实际的数据行,从而提高查询性能。

5.查询中的WHERE条件列加索引

例:

SELECT * FROM users WHERE age = 30;
  • where条件列建立索引可以加快数据检索速度。

6.在JOIN的关联列上建立索引

  • 例:
SELECT * FROM orders o JOIN customers c ON o.customer_id = c.id;
  • orders.customer_idcustomers.id列建立索引,给join关联的两个列设置索引,可以提高JOIN的性能。

总结

  1. 创建索引

    • 单列索引:适用于单字段查询。
    • 复合索引:适用于多字段组合查询。
    • 唯一索引:保证列值唯一。
    • 覆盖索引:避免回表,提高性能。
  2. 使用索引的技巧

    • 在常用的WHEREJOINORDER BY列上建立索引。
    • 避免对索引列使用函数或表达式。
    • 使用EXPLAIN查看查询的执行计划,确保索引生效。

通过合理使用索引,可以有效提升SQL查询性能,并减少数据库的压力。

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

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

相关文章

[Linux网络编程]06-I/O多路复用策略---select,poll分析解释,优缺点,实现IO多路复用服务器

一.I/O多路复用 I/O多路复用是一种用于提高系统性能的 I/O 处理机制。 它允许一个进程(或线程)同时监视多个文件描述符(可以是套接字、管道、终端设备等),等待这些文件描述符中出现读、写或异常状态。一旦有满足条件的…

python爬虫基础篇:文本操作和二进制存储

文本操作 读取方式r readw writea appendb btye 合并方式 text.txt文件写入 lll aaa hhh wywywywywywy 读取文件方式:open(“文件名”,读取方式,编码方式) # ("读取文件名字",读取方式&#xff0…

ts:类的创建(class)

ts:类的创建(class) 一、主要内容说明二、例子class类的创建1.源码1 (class类的创建)2.源码1的运行效果 三、结语四、定位日期 一、主要内容说明 class创建类里主要有三部分组成,变量的声明,构…

ts:数组的常用方法(filter)

ts:数组的常用方法(filter) 一、主要内容说明二、例子filter方法(过滤)1.源码1 (push方法)2.源码1运行效果 三、结语四、定位日期 一、主要内容说明 ts中数组的filter方法,是筛选数…

停止等待协议、回退N帧协议、选择重传协议

停止等待协议、回退N帧协议、选择重传协议的内容、功能特点以及它们之间的区别: 一、停止等待协议 内容: 停止等待协议是最简单但也是最基础的数据链路层协议。该协议规定,发送方每发送一个数据分组后,就停止发送并等待接收方的…

自动化结账测试:使用 Playwright确保电商支付流程的无缝体验【nodejs]

使用 Playwright 掌握端到端结账测试 在电商领域,结账流程是用户体验中至关重要的一环。确保这一流程的稳定性和可靠性对于维护客户满意度和转化率至关重要。在本文中,我们将探讨如何使用 Playwright 进行端到端的结账测试,确保您的结账系统…

【STM32】单片机ADC原理详解及应用编程

本篇文章主要详细讲述单片机的ADC原理和编程应用,希望我的分享对你有所帮助! 目录 一、STM32ADC概述 1、ADC(Analog-to-Digital Converter,模数转换器) 2、STM32工作原理 二、STM32ADC编程实战 (一&am…

【JAVA基础】什么是泛型? 什么是反射?

什么是泛型? 什么是反射? 什么是泛型?一 , 泛型 (Generics) 概述二 , 泛型的主要功能三 , 泛型的基本概念四 , 泛型的使用场景五 , 泛型的基本步骤六 , 泛型的优缺点七 , 示例代码 什么是反射?一 , 反射 (Reflection) 概述二 , 反射的主要功能1 . 获取类的信息2 . 创建对象…

oracle 行转列(PIVOT 多个行数据按照指定的列进行汇总) 列转行(UNPIVOT)

-- PIVOT是Oracle 11g版本引入的一个功能, 用来做行转列 -- as count1 as count2必须加上, 这样列名就没有引号了使用场景:PIVOT常用于数据透视、数据汇总和数据展示等场景,例如将多个行数据按照指定的列进行汇总,生成一条汇总数据&#xf…

如何对网络设备进行监控:以监控易平台为例

随着信息技术的飞速发展,运维行业正面临着前所未有的挑战。设备的多样性、复杂性以及业务需求的不断变化,都对运维团队提出了更高的要求。在这样的背景下,监控易平台应运而生,为运维团队提供了一种高效、全面的设备监控解决方案。…

java包的使用

在Java中,包(package)用于组织类和接口。它们提供了一种将相关的类和接口组织在一起的方式,使得代码更具可读性和可维护性。 要使用一个Java包,需要以下几个步骤: 在Java源代码文件的开头使用package关键字…

C++STL之stack

1.stack的使用 函数说明 接口说明 stack() 构造空的栈 empty() 检测 stack 是否为空 size() 返回 stack 中元素的个数 top() 返回栈顶元素的引用 push() 将元素 val 压入 stack 中 pop() 将 stack 中尾部的元素弹出 2.stack的模拟实现 #include<vector> namespace abc { …

Web3.0技术入门

Web3.0技术入门是一个涉及多个方面和领域的复杂过程&#xff0c;以下是一些关键的步骤和要点&#xff0c;帮助您初步了解并掌握Web3.0技术。 一、了解Web3.0的基本概念 Web3.0也被称为下一代互联网&#xff0c;它是对当前互联网&#xff08;Web2.0&#xff09;的演进和升级。…

LeetCode 热题 100之普通数组

1.最大子数组和 思路分析&#xff1a;这个问题可以通过动态规划来解决&#xff0c;我们可以使用Kadane’s Algorithm&#xff08;卡登算法&#xff09;来找到具有最大和的连续子数组。 Kadane’s Algorithm 的核心思想是利用一个变量存储当前的累加和 currentSum&#xff0c;并…

MATLAB生物细胞瞬态滞后随机建模定量分析

&#x1f3af;要点 基于随机动态行为受化学主方程控制&#xff0c;定量分析单细胞瞬态效应。确定性常微分方程描述双稳态和滞后现象。通过随机性偏微分方程描述出暂时性滞后会逐渐达到平稳状态&#xff0c;并利用熵方法或截断方法计算平衡收敛速度的估计值。随机定量分析模型使…

python查询并安装项目所依赖的所有包

引言 如果需要进行代码的移植&#xff0c;肯定少不了在另一台pc或者服务器上进行环境的搭建&#xff0c;那么首先是要知道在已有的工程的代码中用到了哪些包&#xff0c;此时&#xff0c;如果是用人工去一个一个的代码文件中去查看调用了哪些包&#xff0c;这个工作甚是繁琐。…

Flutter 鸿蒙next中的路由使用详解【基础使用】

✅近期推荐&#xff1a;求职神器 https://bbs.csdn.net/topics/619384540 &#x1f525;欢迎大家订阅系列专栏&#xff1a;flutter_鸿蒙next &#x1f4ac;淼学派语录&#xff1a;只有不断的否认自己和肯定自己&#xff0c;才能走出弯曲不平的泥泞路&#xff0c;因为平坦的大路…

C++《vector的模拟实现》

在之前《vector》章节当中我们学习了STL当中的vector基本的使用方法&#xff0c;了解了vector当中各个函数该如何使用&#xff0c;在学习当中我们发现了vector许多函数的使用是和我们之前学习过的string类的&#xff0c;但同时也发现vector当中一些函数以及接口是和string不同的…

Page Cache(页缓存

Page Cache&#xff08;页缓存&#xff09;是操作系统中一种重要的缓存机制&#xff0c;主要用于提高系统对磁盘访问的性能。以下是对Page Cache的详细解释&#xff1a; 一、定义与功能 Page Cache&#xff0c;即页缓存&#xff0c;是操作系统内核管理的一部分内存区域。它将…

H5实现PDF文件预览,使用pdf.js-dist进行加载

H5实现PDF文件预览&#xff0c;使用pdf.js-dist进行加载 一、应用场景 在H5平台上预览PDF文件是在原本已经开发完成的系统中新提出的需求&#xff0c;原来的系统业务部门是在PC端进行PDF的预览与展示&#xff0c;但是现在设备进行了切换&#xff0c;改成了安卓一体机进行文件…