读SQL学习指南(第3版)笔记08_视图和索引
mhr18 2024-09-13 20:35 29 浏览 0 评论
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
相关推荐
- 【预警通报】关于WebLogic存在远程代码执行高危漏洞的预警通报
-
近日,Oracle官方发布了2021年1月关键补丁更新公告CPU(CriticalPatchUpdate),共修复了包括CVE-2021-2109(WeblogicServer远程代码执行漏洞)...
- 医院信息系统突发应急演练记录(医院信息化应急演练)
-
信息系统突发事件应急预案演练记录演练内容信息系统突发事件应急预案演练参与人员信息科参与科室:全院各部门日期xxxx-xx-xx时间20:00至24:00地点信息科记录:xxx1、...
- 一文掌握怎么利用Shell+Python实现完美版的多数据源备份程序
-
简介:在当今数字化时代,无论是企业还是个人,数据的安全性和业务的连续性都是至关重要的。数据一旦丢失,可能会造成无法估量的损失。因此,如何有效地对分布在不同位置的数据进行备份,尤其是异地备份,成为了一个...
- docker搭建系统环境(docker搭建centos)
-
Docker安装(CentOS7)1.卸载旧版Docker#检查已安装版本yumlistinstalled|grepdocker#卸载旧版本yumremove-ydocker.x...
- 基础篇:数据库 SQL 入门教程(sql数据库入门书籍推荐)
-
SQL介绍什么是SQLSQL指结构化查询语言,是用于访问和处理数据库的标准的计算机语言。它使我们有能力访问数据库,可与多种数据库程序协同工作,如MSAccess、DB2、Informix、M...
- Java21杀手级新特性!3行代码性能翻倍
-
导语某券商系统用这招,交易延迟从12ms降到0.8ms!本文揭秘Oracle官方未公开的Record模式匹配+虚拟线程深度优化+向量API神操作,代码量直降70%!一、Record模式匹配(代码量↓8...
- 一文读懂JDK21的虚拟线程(java虚拟线程)
-
概述JDK21已于2023年9月19日发布,作为Oracle标准Java实现的一个LTS版本发布,发布了15想新特性,其中虚拟线程呼声较高。虚拟线程是JDK21中引入的一项重要特性,它是一种轻量级的...
- 效率!MacOS下超级好用的Linux虚拟工具:Lima
-
对于MacOS用户来说,搭建Linux虚拟环境一直是件让人头疼的事。无论是VirtualBox还是商业的VMware,都显得过于笨重且配置复杂。今天,我们要介绍一个轻巧方便的纯命令行Linux虚拟工具...
- 所谓SaaS(所谓三维目标一般都应包括)
-
2010年前后,一个科技媒体的主编写一些关于云计算的概念性问题,就可以作为头版头条了。那时候的云计算,更多的还停留在一些概念性的问题上。而基于云计算而生的SaaS更是“养在深闺人未识”,一度成为被IT...
- ORA-00600 「25027」 「x」报错(报错0xc0000001)
-
问题现象:在用到LOB大对象的业务中,进行数据的插入,失败了,在报警文件中报错:ORA-00600:内部错误代码,参数:[25027],[10],[0],[],[],[],[],[...
- 安卓7源码编译(安卓源码编译环境lunch失败,uname命令找不到)
-
前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...
- 编译安卓源码(编译安卓源码 电脑配置)
-
前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...
- 360 Vulcan Team首战告捷 以17.5万美金强势领跑2019“天府杯“
-
2019年11月16日,由360集团、百度、腾讯、阿里巴巴、清华大学与中科院等多家企业和研究机构在成都联合主办了2019“天府杯”国际网络安全大赛暨2019天府国际网络安全高峰论坛。而开幕当日最激荡人...
- Syslog 日志分析与异常检测技巧(syslog发送日志配置)
-
系统日志包含有助于分析网络设备整体运行状况的重要信息。然而,理解并从中提取有效数据往往颇具挑战。本文将详解从基础命令行工具到专业日志管理软件的全流程分析技巧,助你高效挖掘Syslog日志价值。Gr...
- 从Oracle演进看数据库技术的发展(从oracle演进看数据库技术的发展的过程)
-
数据库技术发展本质上是应用需求驱动与基础架构演进的双向奔赴,如何分析其技术发展的脉络和方向?考虑到oracle数据库仍然是这个领域的王者,以其为例,管中窥豹,对其从Oracle8i到23ai版本的核...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)