【数据库】索引的使用

【数据库】索引的使用

  • 前言
  • 出发示例
    • 创建表
    • Explain 查看sql执行计划
      • where 查询解析
        • 无索引
        • 有索引
      • where + oderBy 查询解析
        • 无索引
        • 有索引
  • 总结


前言

在数据库设计过程中,常需要考虑性能,好的设计可以大大提高sql 语句的增删改查速度。在表的创建过程中,我们时常会用到主键,而主键又会自动构建索引。在数据库的学习过程中,大家都知道好的索引可以大大提高查询速度,那么到底什么是索引呢?好与坏能否形象点?

其实在以前的博文中【SQL】基础知识整理,我们对这个索引概念是有介绍过的,但在实际使用过程中,除了主键自动创建的,也没有进行很好的应用。而且当时是初次学习数据库,随着这几年的开发,对实际开发情况也有了一定了解,除了常用的语句,其余也有点模糊了,但这个索引概念是很重要的。尤其是好的设计,在接口执行时,可以用的时间更少,系统性能更高。因此,针对这个概念,我们进行重拾,好好牢固牢固基础,好好看看索引好,到底好在哪里?以后写sql时候,能否用上?

本博文以一个示例出发,介绍有索引和没有索引情况,同一句sql 的查询效果,同时通过这个示例也逐渐理解为什么有时候在编写sql时,看大家oderBy时会有多个条件,但其实效果就是一个条件?(基础还是太零碎了,时间久远,横向要学,但纵向更得补补,这才是首要,傻傻虎虎得努力呀

出发示例

示例基于pg 数据库开始,数据库管理器用dbeaver

创建表

CREATE TABLE mytable(
idserial int primary key,
category_id int default 0not null ,
user_id int default 0not null ,
adddate int default 0not null
);

在这里插入图片描述

Explain 查看sql执行计划

使用方法:explain + sql 语句,可以查看执行计划,从而知道数据库是如何处理sql语句的,查看该sql语句有没有使用上了索引,有没有做全表扫描。

where 查询解析

基础的sql 语句SELECT * FROM mytable WHERE category_id=1 AND user_id=2,然后进行有索引和无索引的解析。

EXPLAIN
SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
无索引

通过语句查看,得到结果如下:
在这里插入图片描述

有索引

创建category_id 和 user_id 的索引,命名可以用“表名_字段1名_字段2名”,方便查看。

CREATE INDEX mytable_categoryid_userid ON mytable(category_id,user_id);

然后通过解析语句进行再次查看,得到结果如下:
在这里插入图片描述
可知已经使用了索引mytable_categoryid_userid 。

接下来我们看带oderby的,体验索引的魅力!同时看完后面的内容,就可以理解为什么有时候在编写sql时,看大家oderBy时会有多个条件,但其实效果就是一个条件?

where + oderBy 查询解析

在这里的sql 解析语句如下:

EXPLAIN
SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY adddate DESC;
无索引

通过语句查看,得到结果如下:
在这里插入图片描述
先排序,然后用之前设置的索引mytable_categoryid_userid 选择

有索引

创建category_id 、 user_id 和 adddate的索引,语句如下:

CREATE INDEX mytable_categoryid_userid_adddate ON mytable (category_id,user_id,adddate);

通过语句查看,得到结果如下:

在这里插入图片描述
这样就可以减少排序,直接用索引。

总结

通过建立索引可以极大地提高在数据库中获取所需信息的速度,同时还能提高服务器处理相关搜索请求的效率,但是建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。

  • 对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引;
  • 对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。

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

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

相关文章

ywtool inspect命令

一.巡检介绍 日巡检是通过定时任务每天凌晨2点30进行巡检周巡检时通过定时任务每周日的凌晨3点进行巡检日巡检日志文件路径:/usr/local/ywtools/log/daily,每周日凌晨2点会将这一周的日巡检日志进行压缩,压缩路径:/usr/local/ywtools/log/backup/daily周巡检日志文件路径:/usr…

UDP端口探活的那些细节

一 背景 商业客户反馈用categraf的net_response插件配置了udp探测, 遇到报错了,如图 udp是无连接的,无法用建立连接的形式判断端口。 插件最初的设计是需要配置udp的发送字符,并且配置期望返回的字符串, [[instances]] targets…

ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重提示词

论文完成初稿之后,一般情况下,宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易,即使对老师来说,找人评审论文也是一件苦活。我们这个时候可以通过文字提示让 ChatGPT充当我们的评审专家,为论文提出问题…

Spring Boot的打包方式:JAR vs. WAR 打包方式

Spring Boot的打包方式:JAR vs. WAR 打包方式 Spring Boot是一个流行的Java开发框架,提供了快速、便捷的应用程序开发和部署方式。本文将介绍Spring Boot的两种常见打包方式:JAR和WAR。我们将深入探讨它们的特点、适用场景和部署方式&#xf…

常用ES技巧二

文章目录 一、Object.entries()和Object.fromEntries()1.1、Object.entries()1.2、Object.fromEntries() 二、Symbol类型和Symbol属性三、WeakMap和WeakSet四、Promise.allSettled()五、BigInt六、Array.of和Array.from七、.at和.flat八、总结九、最后 一、Object.entries()和O…

政安晨:示例演绎TensorFlow的官方指南(一){基础知识}

为什么要示例演绎? 既然有了官方指南,咱们在官方指南上看看就可以了,为什么还要写示例演绎的文章呢? 其实对于初步了解TensorFlow的小伙伴们而言,示例演绎才是最重要的。 官方文档已经假定了您已经具备了相当合适的…

史上最全嵌入式(学习路线、应用开发、驱动开发、推荐书籍、软硬件基础)

废话不多说直接上思维导图! 如果有觉得图片看不清楚的,有疑问的,可在评论区进行留言! 群号: 228447240 嵌入式总括 嵌入式书籍推荐 嵌入式软件知识 嵌入式硬件知识 嵌入式应用开发 嵌入式驱动开发 嵌入式视频推荐: 韦…

收到微信发的年终奖。。。

大家好,我是小悟 还剩一天就过除夕了,很多单位都已经放假了,街上的人越来越少,门店关着的很多,说明大家都陆陆续续回自己的家乡过年了。 或许你还在搬砖,坚守节前最后一波工作,或许你正在回家的…

Javaweb之SpringBootWeb案例之登录校验功能的详细解析

2. 登录校验 2.1 问题分析 我们已经完成了基础登录功能的开发与测试,在我们登录成功后就可以进入到后台管理系统中进行数据的操作。 但是当我们在浏览器中新的页面上输入地址:http://localhost:9528/#/system/dept,发现没有登录仍然可以进…

FL Studio21最新正式版更新下载及实用功能详解

FL Studio 21是一款功能强大的音乐制作软件,它经历了多个版本的更新,每次更新都会增加新的功能和优化现有功能,提高用户体验和工作效率。以下是FL Studio 21的一些版本更新、功能特点以及下载方式的介绍: 版本更新: F…

读书笔记:《修心》

前言 这是2024年读完的第一本书,简单写写读后感。 原本以为是我熟悉的那个写《浪潮之巅》的“吴军”老师,只是这个世界上同名的作家罢了。 《修心复杂世界的自在活法》,初看这本书名以为是什么心灵鸡汤的书,翻了几页之后发现竟…

倒计时61天

M-智乃的36倍数(normal version)_2024牛客寒假算法基础集训营3 (nowcoder.com) //非ac代码,超时了,54.17/100#include<bits/stdc.h> using namespace std; const int N1e55; const int inf0x3f3f3f3f; #define int long long int n; string s1[N]; void solve() {cin>…