[SQL系列] 从头开始学PostgreSQL 索引 修改 视图

索引

什么是数据库索引

        数据库索引是一种单独的、物理的数据库结构,用于对数据库表中一列或多列的值进行排序。它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

        索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引的方式与您使用书籍中的索引的方式很相似:它搜索索引以找到特定值,然后顺指针找到包含该值的行。

        索引的底层是 B 树,B 树的中间元素不储存数据,只储存索引,数据存储在 B 树的叶子节点处,一个节点可以存放多个数据,查找一个节点的时候可以有多个元素,大大提升查找效率,这就是为什么数据库索引用的就是 B 树,因为索引很大,不可能都放在内存中,所以通常是以索引文件的形式存储在磁盘上。数据库索引可以大大加快查询的速度,因为在数据十分庞大的时候,索引可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。索引类型包括聚集索引、非聚集索引和联合索引等。聚集索引是在数据库中,所有行数都会按照主键索引排序;非聚集索引就是给普通字段加上索引;联合索引是好几个字段组成的索引。

       

PostgreSQL索引

        PostgreSQL 支持多种类型的索引,包括 B-Tree 索引、哈希索引、GIST 索引、SP-GiST 索引、GIN 索引和 BRIN 索引。每种索引类型都有其独特的优点和适用场景。
       我们这边先不细究各种各样的索引有什么用,先了解它的使用方式:

testdb=# select * from company;
 id | name | age |                      address                       | salary 
----+------+-----+----------------------------------------------------+--------
  2 | CC   |  23 | BeiJing                                            | 100000
  4 | Eoe  |  27 | BeiJing                                            | 100000
  3 | Dod  |  25 | BeiJing                                            | 100000
  5 | Fof  |  25 | Guangzhou                                          |  65000
  6 | Gog  |  27 | Shenzhen                                           |  85000
(5 rows)

testdb=# create index  city_index on company(address);
CREATE INDEX

        这边那就是给company的表中的address这一列,加上了一个名叫city_index的指引,当我们查找通过where address 进行条件搜索时,能够更快地返回结果。

testdb=# drop index city_index;
DROP INDEX

如果我们对于address的筛选太少,或者说总得数据太少。我们就没必要添加索引

索引的类型

单列索引

单列索引就是以表内的某一个列上创建索引,比如刚刚的例子就是以address创建索引

create index single on company(address);

组合索引

组合索引相对单列索引而言,就是基于多个列创建的索引,如果创建索引(a, b, c),那么在筛选条件a,ab或者abc时就会更加便捷。

create index combine on company(name, age);

唯一索引

唯一索引不允许在列中插入重复的值,因此只适合于每一行都不一样的字段。

create unique index onlyone on company(id);

局部索引

局部索引只是在表的子集上构建,子集是通过表达式定义的,只要满足条件的行都会被添加上索引。

create index part on company(条件表达式)

        一般来讲,数据库会自动给主键添加上索引,插入的表的顺序和索引的顺序是一致的,因此给递增的主键加上索引是最方便且最便捷的。

       总结

        建立索引是基于大数据量,并且筛选查询非常频繁的情况下,通过牺牲磁盘空间和插入更改的速度从而加快查询速度的方式。例如,假设有一个包含 1000 行数据的表,其中某一列的值都是唯一的。如果没有索引,查询该列的值需要扫描整个表,耗时较长。如果建立了该列的索引,数据库就可以通过索引快速定位到该列的值,从而提高查询效率。但是这样不免会给磁盘,以及修改数据时带来较大的开销。

修改表

Alter table

        我们在建表之后,由于业务的扩展或者其他的原因,经常要对已经建好的表进行修改,这时候就可以使用alter table添加和删除列与随机约束。

#修改age列从int转化为vvarchar(50)
alter table compnay alter column age varchar(50);

#添加新的列
alter table company add column email varchar(100);

#删除旧的列
alter table company drop column email;

#修改某个值的默认值
alter table company alter column salary set default 100;

#添加非空约束
alter table compnay alter column salary not null;

Truncate table

        删除表,更准确地说是清空表,和delete不同,delete后整张表都没了,但是truncate只是删除表的数据,不删除表的结构。效果是可以立即释放空间,在大型表上非常有用。

        直接看例子把。

testdb=# select * from company;
 id | name | age |                      address                       | salary 
----+------+-----+----------------------------------------------------+--------
  2 | CC   |  23 | BeiJing                                            | 100000
  4 | Eoe  |  27 | BeiJing                                            | 100000
  3 | Dod  |  25 | BeiJing                                            | 100000
  5 | Fof  |  25 | Guangzhou                                          |  65000
  6 | Gog  |  27 | Shenzhen                                           |  85000
(5 rows)

testdb=# truncate table company;
TRUNCATE TABLE
testdb=# select * from company;
 id | name | age | address | salary 
----+------+-----+---------+--------
(0 rows)

视图


        PostgreSQL 视图 (View) 是一种虚拟表,它不存储数据,而是从一个或多个基本表中动态地检索数据。通过创建视图,可以简化复杂的查询,并且可以在不直接访问基本表的情况下从视图中查询数据。

testdb=# select * from students;
 id |  name  | age | gender | class_id 
----+--------+-----+--------+----------
  1 | 张三   |  18 | 男     |        1
  2 | 李四   |  19 | 女     |        1
  3 | 王五   |  20 | 男     |        2
  4 | 赵六   |  18 | 女     |        2
  5 | 陈七   |  19 | 男     |        3
  6 | 孙八   |  20 | 女     |        3
  7 | 周九   |  18 | 男     |        4
  8 | 吴十   |  19 | 女     |        4
  9 | 郑十一 |  20 | 男     |        5
 10 | 王十二 |  18 | 女     |        5
 11 | 何一   |  23 | 女     |        5
 12 | 和二   |  32 | 男     |        5
(12 rows)


                    
testdb=# create view adult as select id, name, age from students where age > 19;
CREATE VIEW
testdb=# select * from adult;
 id |  name  | age 
----+--------+-----
  3 | 王五   |  20
  6 | 孙八   |  20
  9 | 郑十一 |  20
 11 | 何一   |  23
 12 | 和二   |  32
(5 rows)


drop view adult;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文了解Python中的while循环语句

目录 🥩循环语句是什么 🥩while循环 🥩遍历猜数字 🥩while循环嵌套 🥩while循环嵌套案例 🦐博客主页:大虾好吃吗的博客 🦐专栏地址:Python从入门到精通专栏 循环语句是什…

SpringBoot创建和使用

1.Spring Boot的优点 快速集成框架,Spring Boot提供了启动添加依赖的功能,用于秒级成各种框架。内置运行容器,无需配备Tomcat等Web容器,直接运行和部署程序。快速部署项目,无需外部容器即可启动并运行项目。可以完全抛…

概率论和随机过程的学习和整理--番外15,如何计算N合1的合成数量问题?

目录 1 目标问题:多阶2合1的合成问题 1.1 原始问题 1.2 合成问题要注意,合成的数量 1.3 合成问题不能用马尔科夫链来解决 2 方案1:用合成公式合成多次能解决吗? --不能,解决不了递归的问题 3 方案2,…

idea2021.安装pojie教程

1、下载ideaIU-2021.3应用包,点击finish 2、先关闭idea窗口,等会激活了脚本再运行打开。 3、双击运行install-current-user.vbs,等待一会会提示运行成功。 4、运行后,在文件中会多出一条配置 5、打开运行idea,输入激活码&#x…

如何使用curl下载github代码

首先通过chrome打开想要下载的源文件 如图,有那个下载图标时表示不需要鉴权即可下载,一般仓库都会开放只读权限,所以很大概率都有 比如我想下载这个crc32.c文件 那么我就需要知道它在哪个IP中,按下F12打开网络,点击下载…

pytorch安装GPU版本 (Cuda12.1)教程

使用本教程前,默认您已经安装并配置好了python3以上版本 1. 去官网下载匹配的Cuda Cuda下载地址 当前最高版本的Cuda是12.1 我安装的就是这个版本 小提示:自定义安装可以只选择安装Cuda Runtime。Nvidia全家桶不必全部安装。把全家桶全部安装完直接系统…

ChatGPT助力校招----面试问题分享(十二)

1 ChatGPT每日一题:运算放大器与比较器的区别 问题:运算放大器与比较器的区别 ChatGPT:运算放大器和比较器都是电子电路中常用的模拟电路元件,但它们的设计和应用略有不同。下面是两者的主要区别: 功能不同&#xf…

Java集合之List

ArrayLsit集合 ArrayList集合的特点 ArrayList集合的一些方法 ①.add(Object element) 向列表的尾部添加指定的元素。 ②.size() 返回列表中的元素个数。 ③.get(int index) 返回列表中指定位置的元素,index从0开始。 public class Test {public static void m…

【Vue】day03-VueCli(脚手架)

day03 一、今日目标 1.生命周期 生命周期介绍 生命周期的四个阶段 生命周期钩子 声明周期案例 2.综合案例-小黑记账清单 列表渲染 添加/删除 饼图渲染 3.工程化开发入门 工程化开发和脚手架 项目运行流程 组件化 组件注册 4.综合案例-小兔仙首页 拆分模块-局部…

有名管道(FIFO)的学习笔记

文章目录 有名管道介绍有名管道的使用创建 注意事项 有名管道介绍 有名管道的使用 创建 命令, mkfifo name函数,int mkfifo(const char *pathname, mode_t mode); 设置错误号; 向管道中写数据👇: 从管道读数据&am…

前端Web实战:从零打造一个类Visio的流程图拓扑图绘图工具

前言 大家好,本系列从Web前端实战的角度,给大家分享介绍如何从零打造一个自己专属的绘图工具,实现流程图、拓扑图、脑图等类Visio的绘图工具。 你将收获 免费好用、专属自己的绘图工具前端项目实战学习如何从0搭建一个前端项目等基础框架项…

log4j--动态打印日志文件到指定文件夹

文章目录 log4j--动态打印日志文件到指定文件夹1、添加Maven依赖2、配置文件 log4j.properties3、编写日志打印工具类 LogUtil4、工具类调用 log4j–动态打印日志文件到指定文件夹 1、添加Maven依赖 <!-- log4j日志相关坐标 --><dependency><groupId>org.s…

API Testing 一个基于 YAML 文件的开源接口测试工具

目录 前言&#xff1a; 如何使用&#xff1f; 本地模式 服务端模式 文件格式 后续计划 前言&#xff1a; API Testing 是一个基于 YAML 文件的开源接口测试工具&#xff0c;它可以帮助开发者快速地进行接口测试。 在选择工具时&#xff0c;可以从很多方面进行考量、对比…

【Matlab】基于遗传算法优化 BP 神经网络的数据回归预测(Excel可直接替换数据)

【Matlab】基于遗传算法优化 BP 神经网络的数据回归预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.文件结构3.Excel数据4.分块代码4.1 arithXover.m4.2 delta.m4.3 ga.m4.4 gabpEval.m4.5 initializega.m4.6 maxGenTerm.m4.7 nonUnifMutation.m4.8 normGeomSel…

Pytorch:利用torchvision调用各种网络的预训练模型,完成CIFAR10数据集的各种分类任务

2023.7.19 cifar10百科&#xff1a; [ 数据集 ] CIFAR-10 数据集介绍_cifar10_Horizon Max的博客-CSDN博客 torchvision各种预训练模型的调用方法&#xff1a; pytorch最全预训练模型下载与调用_pytorch预训练模型下载_Jorbol的博客-CSDN博客 CIFAR10数据集下载并转换为图片&am…

vue中export和export default的使用

<script> export default {name: HelloWorld } $(function () {alert(引入成功) }) </script> 1、export的使用 比喻index.js要使用test.js中的数据&#xff0c;首先在test.js文件中进行导出操作 代码如下&#xff1a; export function list() {alert("list…

【表达式引擎】简单高效的轻量级Java表达式引擎:Aviator

简单高效的轻量级表达式引擎&#xff1a;Aviator 前言 Aviator 是一个高性能、、轻量级的表达式引擎&#xff0c;支持表达式动态求值。其设计目标为轻量级和高性能&#xff0c;相比于 Groovy 和 JRuby 的笨重&#xff0c;Aviator 就显得更加的小巧。与其他的轻量级表达式引擎不…

Python实战项目——物流行业数据分析(二)

今天我们对物流行业数据进行简单分析&#xff0c;数据来源&#xff1a;某企业销售的6种商品所对应的送货及用户反馈数据 解决问题&#xff1a; 1、配送服务是否存在问题 2、是否存在尚有潜力的销售区域 3、商品是否存在质量问题 分析过程&#xff1a; 依旧先进行数据处理 一…

【MATLAB第58期】基于MATLAB的PCA-Kmeans、PCA-LVQ与BP神经网络分类预测模型对比

【MATLAB第58期】基于MATLAB的PCA-Kmeans、PCA-LVQ与BP神经网络分类预测模型对比 一、数据介绍 基于UCI葡萄酒数据集进行葡萄酒分类及产地预测 共包含178组样本数据&#xff0c;来源于三个葡萄酒产地&#xff0c;每组数据包含产地标签及13种化学元素含量&#xff0c;即已知类…

C# List 详解四

目录 18.FindLast(Predicate) 19.FindLastIndex(Int32, Int32, Predicate) 20.FindLastIndex(Int32, Predicate) 21.FindLastIndex(Predicate) 22.ForEach(Action) 23.GetEnumerator() 24.GetHashCode() 25.GetRange(Int32, Int32) C#…