【数据库】索引的使用

【数据库】索引的使用


前言

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

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

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

出发示例

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

创建表

sql 复制代码
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,然后进行有索引和无索引的解析。

sql 复制代码
EXPLAIN
SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
无索引

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

有索引

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

sql 复制代码
CREATE INDEX mytable_categoryid_userid ON mytable(category_id,user_id);

然后通过解析语句进行再次查看,得到结果如下:

可知已经使用了索引mytable_categoryid_userid 。

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

where + oderBy 查询解析

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

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的索引,语句如下:

sql 复制代码
CREATE INDEX mytable_categoryid_userid_adddate ON mytable (category_id,user_id,adddate);

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

这样就可以减少排序,直接用索引。

总结

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

  • 对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引;
  • 对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。
相关推荐
数据知道5 分钟前
PostgreSQL实战:详细讲述UUID主键,以及如何生成无热点的分布式主键
数据库·分布式·postgresql
数据知道5 分钟前
PostgreSQL实战:如何选择合适的数据类型?
数据库·postgresql
nvd1118 分钟前
Pytest 异步数据库测试实战:基于 AsyncMock 的无副作用打桩方案
数据库·pytest
os_lee35 分钟前
Milvus 实战教程(Go 版本 + Ollama bge-m3 向量模型)
数据库·golang·milvus
laplace012336 分钟前
向量库 Qdrant + 图数据库Neo4j+Embedding阿里百炼text-embedding-v3
数据库·embedding·agent·neo4j
云边有个稻草人37 分钟前
从痛点到落地:金仓时序数据库核心能力拆解
数据库·时序数据库·kingbasees·金仓数据库·数据库安全防护
霍格沃兹测试学院-小舟畅学41 分钟前
Playwright数据库断言:测试前后数据验证
数据库·oracle
REDcker1 小时前
C86 架构详解
数据库·微服务·架构
世人万千丶1 小时前
Day 5: Flutter 框架 SQLite 数据库进阶 - 在跨端应用中构建结构化数据中心
数据库·学习·flutter·sqlite·harmonyos·鸿蒙·鸿蒙系统
学编程的小程2 小时前
从“单模冲锋”到“多模共生”——2026 国产时序数据库新物种进化图谱
数据库·时序数据库