索引的使用和优化

news2024/10/27 14:37:57

索引就是一种快速查询和检索数据的数据结构,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. ORDER BY 优化使用索引

场景:按用户年龄排序

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

SELECT * FROM users ORDER BY age;

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

CREATE INDEX idx_age ON users(age);

 

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

场景:按创建时间查询

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

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

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

6. 删除和查看索引

删除索引:

DROP INDEX idx_age ON users;

查看表中的索引:

SHOW INDEX FROM users;

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

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

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

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

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

8. 使用覆盖索引

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

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

CREATE INDEX idx_name_age_cover ON users(name, age);

使用覆盖索引的查询:

SELECT name, age FROM users WHERE age = 25;

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

总结

  1. 创建索引

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

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

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

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

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

相关文章

【数据结构】宜宾大学-计院-实验五

实验五 栈和队列(队列的基本操作) 实验目的:链表结点结构:实验结果:运行截图:代码实现: 实验目的: 1.掌握队列的顺序存储结构和链式存储结构 2.实现队列的基…

(北京政务服务满意度公司)满意度调查助力服务质量提升

在当今社会,(政务服务满意度公司)政务窗口服务的质量直接关系到市民的日常生活和城市的健康发展。为了解市民对政务窗口服务的满意度,提升服务质量,某市委托民安智库专业市场调查公司开展了政务窗口服务满意度调查&…

若依框架部署到服务器刷新或者是退出登录出现404

登出错误404 改成/登出的时候重定向到根路径,让nginx匹配去找dist目录下的index.html文件 或者是直接改为/index.html,少一步可能会快一点? 不过会变得很丑,算了还是根目录吧 原版是index,那玩意是 针对路由的,而打包…

【重生之我要苦学C语言】 函数递归

函数递归 什么是递归? 递归就是函数自己调用自己 递归一定是基于函数的 在任何一次函数调用中,都会申请资源,申请的是内存中栈区的资源 栈区的资源是有限的,因此函数不能无限次的递归 递归的思想 把一个大型复杂问题层层转化为…

解决docker拉取readeck镜像报Error response from daemon: toomanyrequests问题

readeck 是一个内容中心,目前已支持中文翻译 这是本地化部署后的效果: 原命令为: docker run --rm -ti -p 8000:8000 -v readeck-data:/readeck codeberg.org/readeck/readeck:latest Unable to find image codeberg.org/readeck/readeck:la…

数据库的诗篇:深入探索 MySQL 表操作的艺术与哲学

文章目录 前言🌸一、创建表——搭建数据存储的基础框架1.1 基本语法1.2 创建表的实际案例解释: 1.3 表设计的最佳实践 🌸二、查看表结构——快速了解数据库设计2.1 使用 DESC 命令解释: 2.2 使用 SHOW COLUMNS 命令2.3 使用 SHOW …

[MySQL#2] 库 | 表 | 详解CRUD命令 | 字符集 | 校验规则

目录 一. 库操作 1. 创建数据库 2. 字符集和校验规则 校验规则对数据库的影响 显示创建数据库时对应的命令 3. 修改数据库 4. 数据库删除 备份和恢复 还原 查看连接情况 二. 表操作 1. 创建表(定义实例化格式 2. 创建表案例 (实例化数据类型…

【Fargo】12:参考mediasoup 重构 udpsocket管理、定时器、uv生命周期

udp 发送的包是动态分配的内存,即使考虑rtppacket类型,也是动态分配的内存构造rtppacket,因此应该考虑对这块内存管理起来。之前的实现采用了一个固定分配的内存,可能会节省内存,固定大小虽然不够灵活,但是可以规避频繁分配导致的内存碎片。每次都动态分配一个uv_udp_sen…

vue3+vite 部署npm 包

公司需要所以研究了一下怎么部署安装,比较简单 先下载个vue项目 不用安准路由,pinna 啥的,只需要一个最简单的模版 删掉App.vue 中的其它组件 npm create vuelatest 开始写自定义组件 新建一个el-text 组件, name是重点,vue3中…

【10天速通Navigation2】(三) :Cartographer建图算法配置:从仿真到实车,从原理到实现

前言 往期内容: 第一期:【10天速通Navigation2】(一) 框架总览和概念解释第二期:【10天速通Navigation2】(二) :ROS2gazebo阿克曼小车模型搭建-gazebo_ackermann_drive等插件的配置和说明 本教材将贯穿nav2的全部内容&#xff0c…

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误 测试环境1、 MYODBC 3.51.18 or higher2、分析和解决2.1 解决1,降级MySQL ODBC2.2 解决2,修改FreeSWITCH代码 测试环境 http://myfs.f3322.net:8020/ 用户名:admin,密…

双11必买物品清单有哪些?双11推荐购买清单分享

随着双11购物节的到来,这个由光棍节演变而来的全民狂欢节已经成为了中国乃至全球最大的在线购物盛事。对于精明的购物者来说,双11不仅是一个购物的好时机,更是一个精打细算、囤货备需的黄金时刻。那么双11必买物品清单有哪些?在这…

基于Arduino的LED亮灭按键控制

一、项目简介 通过一个按键控制LED的亮灭,实现按键按一下LED点亮,再按一下LED熄灭,交替循环。 二、控制原理 1. 按键检测原理: 将Arduino的监测端口设置为输入上拉模式(INPUT_PULLUP),用于连…

C++结合图形编程与物联网:你更偏向哪种方式来学习信息学奥赛?

随着信息学奥赛在全国范围内的热度逐年攀升,学生和家长们越来越重视如何有效备赛。传统的编程学习方式侧重于算法和数据结构,但随着科技的发展,图形化编程与物联网(IoT)项目逐渐成为新兴的学习路径。通过C结合图形化编…

直播系统源码技术搭建部署流程及配置步骤

系统环境要求 PHP版本:5.6、7.3 Mysql版本:5.6,5.7需要关闭严格模式 Nginx:任何版本 Redis:需要给所有PHP版本安装Redis扩展,不需要设置Redis密码 最好使用面板安装:宝塔面板 - 简单好用的…

存储过程(SQL)

1.存储过程 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 2.MySQL存储过程创建…

qt QApplication详解

一、概述 QApplication是Qt应用程序的基础类,负责设置和管理应用的环境。它的主要功能包括:初始化应用程序、管理事件循环、处理命令行参数、提供全局设置(如样式和调色板)以及创建和管理主窗口。通常在main函数中创建QApplicati…

基于物联网的智慧考场系统设计(论文+源码)

1. 功能设计 (1)温度监测与控制功能: 系统需要能够实时采集考场内的温度信息,通过DS18B20传感器获取准确的数据,并在OLED屏幕和APP上显示。当温度异常过高时,系统应自动启动继电器,模拟空调开启…

【网络协议栈】Tcp协议(下)的可靠性和高效性(超时重传、快速重传、拥塞控制、流量控制)

绪论: 承接上文,上文写到Tcp协议的结构以及对tcp协议的性能优化的滑动窗口,本章我们将继续了解Tcp协议的可靠性和高效性的具体展示。后面我将继续完善网络协议栈的网络层协议敬请期待! 话不多说安全带系好,发车啦(建议…