【数据库】索引的使用

【数据库】索引的使用


前言

在数据库设计过程中,常需要考虑性能,好的设计可以大大提高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字句单独建立索引;
  • 对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。
相关推荐
TDengine (老段)17 分钟前
TDengine 数学函数 FLOOR 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
大气层煮月亮1 小时前
Oracle EBS ERP开发——报表生成Excel标准模板设计
数据库·oracle·excel
云和数据.ChenGuang1 小时前
达梦数据库的命名空间
数据库·oracle
三三木木七2 小时前
mysql拒绝连接
数据库·mysql
蹦跶的小羊羔2 小时前
sql数据库语法
数据库·sql
唐古乌梁海2 小时前
【mysql】InnoDB的聚簇索引和非聚簇索引工作原理
数据库·mysql
我变秃了也没变强2 小时前
pgsql配置密码复杂度策略
数据库·postgresql
PawSQL2 小时前
企业级SQL审核工具PawSQL介绍(1) - 六大核心能力
数据库·sql·oracle
幼稚园的山代王2 小时前
NoSQL介绍
数据库·nosql
猫林老师2 小时前
HarmonyOS线程模型与性能优化实战
数据库·分布式·harmonyos