读SQL学习指南(第3版)笔记08_视图和索引

news2024/11/28 17:42:28

 

1. 精心设计的应用程序通常会在保持实现细节私有的同时公开公有接口,以便未来在不影响最终用户的情况下修改设计

2. 视图

2.1. 不同于数据表,视图并不涉及数据存储,不用担心视图会填满你的磁盘空间

2.2. 一种数据查询机制

2.3. 从用户的视角来看,视图和数据表没什么两样

3. 为什么要使用视图

3.1. 数据安全

3.1.1. 如果你创建了数据表并允许用户查询,用户就可以访问数据表中的每一行和每一列

3.1.2. 保持数据表的私有性(不授权任何用户select许可),然后创建一个或多个视图,忽略或模糊化(比如customer_vw.email列采用的'*'方法)敏感列

3.1.3. 虚拟私有数据库(virtual private database,VPD)

3.1.3.1. Oracle Database用户另一种选择可以保护数据表的行列数据安全

3.1.3.2. VPD允许用户对数据表施加策略,服务器据此对用户的查询进行修改

3.2. 数据聚合

3.2.1. 生成报表的应用程序通常需要聚合数据

3.2.2. 将数据预先在数据表中聚合而不是使用视图求和以极大地提高查询性能

3.3. 隐藏复杂性

3.3.1. 为了使最终用户免受复杂性的影响

3.4. 连接分区数据

3.4.1. 为了提升性能会将较大的数据表拆分为多个部分

3.4.2. 设计人员可以在无须强制数据库用户修改查询的情况下改动底层数据的结构

4. 可更新视图

4.1. MySQL、Oracle Database和SQL Server都允许用户在遵守特定限制的前提下通过视图修改数据

4.2. MySQL满足下列条件,视图就是可更新的

4.2.1. 没有使用聚合函数(max()、min()、avg()等)

4.2.2. 视图没有使用group by或having子句

4.2.3. select或from子句中不存在子查询,并且where子句中的任何子查询都不引用from子句中的数据表

4.2.4. 视图没有使用union、union all或distinct

4.2.5. from子句至少包括一个数据表或可更新视图

4.2.6. 如果有不止一个数据表或视图,from子句只使用内连接

5. 索引

5.1. 查找资源内特定项的一种机制

5.2. 数据库服务器也使用索引来定位数据表中的行

5.3. 与普通的数据表不同,索引是一种以特定顺序保存的专用数据表

5.4. 索引并不包含实体的所有相关数据,而是只包含那些可用于定位数据表中行的列,以及描述这些行所在的物理位置信息

5.5. 索引的作用就是使检索数据表中行和列的子集实现便捷化,无须再检查数据表中的每一行

5.6. MySQL 5.0版也提供了create index,但该命令被映射到alter table命令,仍然必须使用alter table命令创建主键索引

5.6.1. mysql-

-> ALTER TABLE customer
    -> ADD INDEX idx_email (email);

5.6.2. sql

CREATE INDEX dept_name_idx
    ON department (name);

5.7. MySQL也支持drop index命令,不过同样是被映射到alter table命令

5.7.1. mysql

-> ALTER TABLE customer
    -> DROP INDEX idx_email;

5.7.2. sql

DROP INDEX idx_email; (Oracle)
DROP INDEX idx_email ON customer; (SQL Server)

5.8. MySQL用户可以使用show命令查看特定数据表的所有索引

5.9. 所有的数据库服务器都允许查看可用的索引

5.10. 唯一索引

5.10.1. 提供普通索引所能提供的所有便利

5.10.2. 避免索引列出现重复值

5.10.3. 只要有行插入或是索引列被修改,数据库服务器就会检查唯一索引,以查看该值是否已经在数据表中的其他行存在

5.10.4. SQL Server和Oracle Database用户只需在创建索引时加入unique关键字

5.10.4.1. sql

CREATE UNIQUE INDEX idx_email
    ON customer (email);

5.10.5. mysql

-> ALTER TABLE customer
    -> ADD UNIQUE idx_email (email);

5.11. 多列索引

5.11.1. 在创建多列索引时,必须仔细考虑哪一列在前,哪一列在后,这样才能使索引尽可能地发挥作用

5.11.2. 如果需要确保充分的响应时间,完全可以基于不同顺序为列的同一集合创建多个索引

5.11.3. mysql

-> ALTER TABLE customer
    -> ADD INDEX idx_full_name (last_name, first_name);

5.12. 索引类型

5.12.1. B树索引

5.12.1.1. 平衡树索引(balanced-tree index)

5.12.1.1.1. B树索引(B-tree index)

5.12.1.2. MySQL、Oracle Database和SQL Server均默认采用B树索引

5.12.1.3. B树索引擅长处理包含大量不同值的列

5.12.2. 位图索引

5.12.2.1. 对于那些只包含少量值却占据了大量行的列(所谓的低基数数据)

5.12.2.2. 对于低基数数据而言,位图索引是一种友好且紧凑的索引解决方案

5.12.2.3. 如果列中存储的值的数量相较于行数攀升得过高(所谓的高基数数据),这种索引策略就不适合了,因为服务器需要维护太多的位图

5.12.2.4. Oracle Database引入了位图索引(bitmap index),其为存储在列中的每个值生成一个位图

5.12.2.4.1. CREATE BITMAP INDEX idx_active ON customer (active);

5.12.2.5. 通常用于数据仓库环境,其中大量数据通常在包含相对较少值的列(例如销售季度、地理区域、产品、销售人员)上进行索引

5.12.3. 文本索引

5.12.3.1. MySQL和SQL Server提供的是全文索引(full-text index)

5.12.3.2. Oracle Database提供了一套称为Oracle Text的强大工具集

5.13. 允许用户查看查询优化器是如何处理SQL语句的

5.13.1. SQL Server用户可以在执行SQL 语句之前通过发出set showplan_text on语句查看该语句的执行计划

5.13.2. Oracle Database提供了explain plan语句,通过执行该语句可以将执行计划写入专用的数据表plan_table

5.14. 索引的不足

5.14.1. 索引并不是越多越好

5.14.1.1. 每个索引其实都是一个数据表(特殊类型的表)

5.14.1.2. 索引越多,服务器就需要做越多的工作来保持所有模式对象都处于最新状态,这会使服务器的运行速度减慢

5.14.2. 索引需要磁盘空间,同时也需要管理员花费精力进行管理,因此对于索引的最佳策略就是仅当有明确需求时才添加索引

5.14.2.1. 如果出于一些特殊目的要用到索引,比如每月的例行维护工作,可以先添加索引,例行维护,然后再删除索引,下次需要例行维护时再如此重复

5.14.2.2. 数据被连夜加载到数据仓库时就会出现问题,常见做法是在数据被加载之前撤销索引,然后在数据仓库开放业务之前重新创建索引

5.15. 索引不能太多,也不能太少

5.15.1. 确保所有主键列被索引

5.15.2. 对于多列主键,可以考虑为主键列的子集或是以不同于主键约束定义的顺序为所有主键列创建额外的索引

5.15.3. 为所有被外键约束引用的列创建索引

5.15.4. 为被用于频繁检索数据的列创建索引

5.15.5. 除了短字符串(2~50个字符)列,大多数日期列也是不错的候选对象

6. 约束

6.1. 施加于数据表中一列或多列的限制

6.1.1. 如果没有约束,数据库的一致性就会存疑

6.2. 主键约束

6.2.1. 标识一列或多列,保证其值在数据表中的唯一性

6.3. 外键约束

6.3.1. 限制一列或多列只能包含其他数据表的主键列中的值

6.3.2. on delete restrict

6.3.2.1. on delete restrict,如果删除了父表(address或store)中被子表(customer)引用的行,服务器会引发错误

6.3.3. on delete cascade

6.3.4. on delete set null

6.3.5. on update restrict

6.3.6. on update cascade

6.3.6.1. on update cascade,使服务器将父表(address或store)主键值的改动传播到子表(customer)

6.3.7. on update set null

6.4. 唯一约束

6.4.1. 限制一列或多列的值,保证其在数据表中的唯一性

6.5. 检查约束

6.5.1. 限制列的可用值范围

6.6. sql

ALTER TABLE customer
ADD CONSTRAINT fk_customer_address FOREIGN KEY (address_id)
REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE;
ALTER TABLE customer
ADD CONSTRAINT fk_customer_store FOREIGN KEY (store_id)
REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE;

6.7. 如果想删除主键约束或外键约束,也可以使用alter table语句,只不过要将add改为drop

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

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

相关文章

基于swing的中国象棋java小游戏jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、主要功能 可以实现双人下棋,可以悔棋,可…

R语言其他相关函数(各函数解析含实例,可供查询)

目录 一.函数相关 1.函数定义:function 2.调用文件:source 3. Call 4.Recall 5.browser 6.debug和undebug 7.trace 8.traceback 9.options 10.missing 11.nargs 12.stop 13.指定退出时执行的表达式 14.expression和eval 15.system.time 16. invisi…

Springboot+mybatis-plus+dynamic-datasource 切换数据源失败问题总结

Springbootmybatis-plusdynamic-datasourceDruid 多数据源 切换数据源失败总结 文章目录 Springbootmybatis-plusdynamic-datasourceDruid 多数据源 切换数据源失败总结0.前言1. dynamic-datasource 切换数据源失败场景总结1. spring-batch整合情况下切换数据源异常解决办法&am…

Matlab图像处理-图像缩放

基本概念 图像缩放是指将给定的图像在x轴方向按比例缩放a倍,在y轴方向按比例缩放b倍,从而获得一幅新的图像。 如果ab,即在x轴方向和y轴方向缩放的比率相同,则称这样的比例缩放为图像的全比例缩放。 如果a≠b,图像比…

Spring: HiddenHttpMethodFilter的用法及原理

作用&#xff1a;将html表单提交的post请求转换为put请求或delete请求发给接口。 html不支持put和delete. 一、web.xml中配置过滤器 <filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenH…

认识SQL sever

目录 一、数据库的概念 1.1数据库的基本概念 1.2对数据库的了解 二、数据库的分类 2.1关系型数据库&#xff08;RDBMS&#xff09;&#xff1a; 2.2非关系型数据库&#xff08;NoSQL&#xff09;&#xff1a; 2.3混合数据库&#xff1a; 2.4数据仓库&#xff1a; 2.5嵌…

二叉树中的堆

堆的概念和结构 大堆&#xff1a; 树中的任何一个父亲都大于等于孩子 小堆&#xff1a; 树中的任何一个父亲都小于等于孩子 堆在逻辑上是二叉树来存储的&#xff0c;就是在我们的想象中他是按二叉树来存储的&#xff0c;但是在实际上&#xff0c;它是以数组的形式来存储的&…

软考A计划-网络工程师-复习背熟-路由器与交换配置和网络安全

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

移动端如何适配不同的屏幕尺寸

在移动端开发中&#xff0c;适配不同的屏幕尺寸是一个重要的考虑因素。以下是一些常用的方法来实现移动端的屏幕适配&#xff1a; 使用响应式布局&#xff1a;使用CSS媒体查询和弹性布局来根据屏幕尺寸调整页面布局和元素大小。通过设置百分比、em或rem单位来实现元素的相对大小…

ICCV 2023 | 港中文MMLab: 多帧光流估计模型VideoFlow,首次实现亚像素级别误差

本文提出了一个多帧光流估计模型 VideoFlow&#xff0c;旨在充分挖掘视频中的时序信息和运动规律&#xff0c;避免当前主流方法只以两帧图片作为输入而面临的信息瓶颈&#xff0c;显著提升了光流估计的性能。 在公开的 Sintel Bechmark 上&#xff0c;VideoFlow 在 Clean 和 Fi…

过期订单关闭

由于Redis具有过期监听的功能&#xff0c;于是就有人拿它来实现过期订单关闭&#xff0c;但是这个方案并不完美。今天来聊聊11种实现订单定时关闭的方案&#xff0c;总有一种适合你&#xff01; 在电商、支付等系统中&#xff0c;一般都是先创建订单&#xff08;支付单&#x…

七牛云OSS存储

前言: 七牛云的存储项目的附件,需要开发一套七牛云的工具类,可以使用该工具类进行七牛云服务器进行文件的上传与下载操作; 七牛云的文档学习: 相关的依赖项的配置: <dependency><groupId>com.amazonaws</groupId><artifactId>aws-java-sdk-s3…

如何改善客户服务?

提供优质的客户服务是经营成功企业的一个重要方面。满意的客户更有可能成为回头客&#xff0c;并向他人推荐你的产品或服务。在当今竞争激烈的市场中&#xff0c;良好的客户服务可能是一家繁荣的企业与一家艰难生存的企业的区别。今天&#xff0c;我们就改善客户服务6个行之有效…

面试官眼中的理想候选人:如何成为他们的首选

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

测试理论与方法----测试流程第五个步骤:测试总结报告

10、通用测试技术 1、测试总结报告概述 定义&#xff1a;把测试过程和结果整理成文档&#xff0c;对发现的问题和缺陷进行分析&#xff0c;为纠正软件的质量提供依据&#xff0c;同时为后续的验收和交付打下基础。测试报告是测试阶段最后的产出&#xff0c;一份详细的测试报告…

【已解决】为什么RAR压缩包里的文件无法删除?

小伙伴们是否遇到过这样的问题&#xff1f;打开RAR压缩包&#xff0c;想要删除里面的文件却发现无法删除&#xff0c;提示“不支持当前操作”。 其实&#xff0c;这是文件在压缩的时候设置了“锁定压缩文件”&#xff0c;设置后&#xff0c;除了无法删除压缩包里的文件&#xf…

控制ATOS/HYDAC/VICKERS比例插装阀线圈放大器

驱动各种国产或进口品牌开环控制比例插装式阀的线圈&#xff0c;如SUN/ATOS/HYDAC/VICKERS/REXROTH/HYDRAFORCE等品牌比例插装式方向阀、流量阀、压力阀、叠加阀等。 比例放大器参数&#xff1a; 电源24VDC标准&#xff1b; 输入指令0-10V、4-20 mA、0-5V可选&#xff1b; …

线上排查定位OOM问题的记录

整体思路&#xff1a;把机器上的快照文件下载到本地电脑&#xff0c;用eclipse analyzer打开它&#xff0c;找到是哪一行导致oom。 注&#xff1a;日志里看不到报错信息是因为 还没有来得及记录到日志文件&#xff0c;就down了。 把该文件下载到本地电脑&#xff0c;可以借助x…

八、代理模式

一、什么是代理模式 代理模式的定义&#xff1a;由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时&#xff0c;访问对象不适合或者不能直接引用目标对象&#xff0c;代理对象作为访问对象和目标对象之间的中介。 代理模式的主要角色如下: 抽象主题&#xff08…

OutOfMemoryError内存溢出和StackOverFlowError栈溢出及解决方法

前一篇&#xff1a;JVM 内存结构 StackFlowError&#xff08;栈溢出&#xff09; 线程的堆栈存储 线程局部原始数据类型、变量、对象的引用、返回值。如果线程堆栈大小超出分配的内存限制&#xff0c;就会出现栈溢出错误。 这里用递归调演示错误 解决方法&#xff1a; 1、修…