索引的使用以及使用索引优化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 处理机制。 它允许一个进程(或线程)同时监视多个文件描述符(可以是套接字、管道、终端设备等),等待这些文件描述符中出现读、写或异常状态。一旦有满足条件的…

ts:类的创建(class)

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

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

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

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

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

C++STL之stack

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

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;这个工作甚是繁琐。…

C++《vector的模拟实现》

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

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

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

基于neo4j的课程资源生成性知识图谱

你是不是还在为毕业设计苦恼&#xff1f;又或者想在课堂中进行知识的高效管理&#xff1f;今天给大家分享一个你一定会感兴趣的技术项目——基于Neo4j的课程资源生成性知识图谱&#xff01;&#x1f4a1; 这套系统通过知识图谱的形式&#xff0c;将课程资源、知识点和学习路径…

前端页面样式没效果?没应用上?

当我们在开发项目时会有很多个页面、相同的标签&#xff0c;也有可能有相同的class值。样式设置的多了&#xff0c;分不清哪个是当前应用的。我们可以使用网页的开发者工具。 在我们开发的网页中按下f12或&#xff1a; 在打开的工具中我们可以使用元素选择器&#xff0c;单击我…

渗透测试-百日筑基—SQL注入篇时间注入绕过HTTP数据编码绕过—下

day8-渗透测试sql注入篇&时间注入&绕过&HTTP数据编码绕过 一、时间注入 SQL注入时间注入&#xff08;也称为延时注入&#xff09;是SQL注入攻击的一种特殊形式&#xff0c;它属于盲注&#xff08;Blind SQL Injection&#xff09;的一种。在盲注中&#xff0c;攻击…

基于丑萌气质狗--C#的sqlserver学习

#region 常用取值 查询List<string> isName new List<string> { "第一", "第二", "第三", "第四" }; List<string> result isName.Where(m > m "第三").ToList();MyDBContext myDBnew MyDBContext(…

web3对象如何连接以太网络节点

实例化web3对象 当我们实例化web3对象&#xff0c;我们一般开始用本地址&#xff0c;如下 import Web3 from web3 var web3 new Web3(Web3.givenProvider || ws://localhost:5173)我们要和以太网进行交互&#xff0c;所以我们要将’ws://localhost:5173’的本地地址换成以太…

如何在短时间内入门并掌握深度学习?

如何在短时间内快速入门并掌握深度学习&#xff0c;是很多读者的困惑——晦涩难懂的数学 知识、复杂的算法、烦琐的编程……深度学习虽然让无数读者心怀向往&#xff0c;却也让不少人望而生畏&#xff0c;深感沮丧&#xff1a;时间没少花&#xff0c;却收效甚微。 如何才能更好…

python对文件的读写操作

任务:读取文件夹下的批量txt数据&#xff0c;并将其写入到对应的word文档中。 txt文件中包含&#xff1a;编号、报告内容和表格数据。写入到word当中&#xff1a;编号、报告内容、表格数据、人格雷达图以及对应的详细说明&#xff08;详细说明是根据表格中的标识那一列中的加号…

设计模式(二)工厂模式详解

设计模式&#xff08;二&#xff09;工厂模式详解 简单工厂模式指由一个工厂对象来创建实例,适用于工厂类负责创建对象较少的情况。例子&#xff1a;Spring 中的 BeanFactory 使用简单工厂模式&#xff0c;产生 Bean 对象。 工厂模式简介 定义&#xff1a;工厂模式是一种创建…

js构造函数和原型对象,ES6中的class,四种继承方式

一、构造函数 1.构造函数是一种特殊的函数&#xff0c;主要用来初始化对象 2.使用场景 常见的{...}语法允许创建一个对象。可以通过构造函数来快速创建多个类似的对象。 const Peppa {name: 佩奇,age: 6,sex: 女}const George {name: 乔治,age: 3,sex: 男}const Mum {nam…

pytorch的标签平滑介绍

什么是标签平滑(Label Smoothing)? 标签平滑(Label Smoothing)是一种正则化技术,旨在防止模型过度自信(即输出的概率分布过于“尖锐”)。在分类任务中,标准的目标标签是one-hot编码,也就是正确类别的概率为 1,其他类别的概率为 0。而标签平滑通过将正确类别的概率从…