1.视图是什么?
- 视图是一种虚拟的表,是从数据库中一个或多个表中导出来的表。
- 数据库中存放了视图的定义,而并没有存放视图中的数据,这些数据存放在原来的表中。
- 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。
1.1.视图的语法
CREATE VIEW <视图名> AS <SELECT语句>
2.视图的重要性?
- 定制用户数据,聚焦特定的数据在实际的应用过程中,不同的用户可能对不同的数据有不同的要求。
例如,当数据库同时存在时,如学生基本信息表、课程表和教师信息表等多种表同时存在时,可以根据需求让不同的用户使用各自的数据。学生查看修改自己基本信息的视图,安排课程人员查看修改课程表和教师信息的视图,教师查看学生信息和课程信息表的视图。- 使操作简便化。在使用查询时,很多时候要使用聚合函数,同时还要显示其他字段的信息,可能还需要关联到其他表,语句可能会很长,如果这个动作频繁发生的话,可以创建视图来简化操作。(通过筛选,组合从而以不同的角度呈现数据,方便用户进行数据管理和分析。比如:多表查询时,我们只需要看几个字段)
- 增加数据的安全性。视图是虚拟的,物理上是不存在的。可以只授予用户视图的权限,而不具体指定使用表的权限,来保护基础数据的安全。(我们使用视图去修改,删除数据并不会改变原数据库中的数据)
- 共享所需数据
通过使用视图,每个用户不必都定义和存储自己所需的数据,可以共享数据库中的数据,同样的数据只需要存储一次。(比如:政府部门之间的官员任免,这时政府中会共用一张用户表。- 更改数据格式
通过使用视图,可以重新格式化检索出的数据,并组织输出到其他应用程序中。(比如我们在数据库中存储的时间日期是字符串,要想比较就得转换成data类型的)- 重用 SQL 语句
视图提供的是对查询操作的封装,本身不包含数据,所呈现的数据是根据视图定义从基础表中检索出来的,如果基础表的数据新增或删除,视图呈现的也是更新后的数据。视图定义后,编写完所需的查询,可以方便地重用该视图。- 总的来说,视图提供了一种简化、安全、抽象的数据访问方式,可以提高数据访问的效率、数据安全性和应用程序的灵活性。通过使用视图,可以将复杂的查询逻辑隐藏起来,简化数据操作,提高代码复用性,并降低维护成本。
3.什么时候该使用视图(常见使用场景)
1. 数据权限控制:
✌️示例:在一个企业内部的人力资源系统中,有一个包含所有员工信息的表。根据不同的用户角色和权限,可以创建不同的视图,限制用户只能看到他们负责的部门或团队的员工信息,而无法访问其他部门的数据。这样可以有效控制数据的访问权限,提高数据的安全性
2. 数据报表和分析:
✌️示例:在一个销售管理系统中,有一个包含订单信息的表。可以创建一个视图,对订单数据进行筛选、分组、计算等操作,生成各种类型的报表,如销售额统计、客户购买趋势分析等。这样,用户可以通过简单的查询视图来获取需要的报表数据,而无需编写复杂的查询语句
3. 数据整合和补充:
✌️示例:在一个电商平台中,有多个数据库表存储了产品信息、库存信息和销售信息。可以创建一个视图,将这些表联接起来,以提供更全面的产品信息。例如,可以创建一个视图,包含产品名称、价格、库存量和销售数量等信息,方便用户查看产品的完整信息
4. 数据规范化和简化:
✌️示例:在一个多表关联的数据库中,有一些常用的查询操作需要经常被使用,可以为这些查询操作创建视图,以简化查询语句并提高可读性。例如,可以创建一个视图,将多个表关联起来,并根据特定条件筛选出符合条件的数据,使得查询时只需使用简单的视图查询语句来获取所需结果
👀👀视图的使用场景是多样的,可以根据具体的数据需求和应用要求进行灵活的定义和使用,以提高数据操作的效率和易用性
4 .索引是什么
索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列。否则,数据库系统将读取每条记录的所有信息进行匹配
可以把索引比作新华字典的音序表。例如,要查“库”字,如果不使用音序,就需要从字典的 400 页中逐页来找。但是,如果提取拼音出来,构成音序表,就只需要从 10 多页的音序表中直接查找。这样就可以大大节省时间
✌️所以,使用索引可以很大程度上提高数据库的查询速度,还有效的提高了数据库系统的性能
5.索引的重要性?
优点:
提高查询数据的速度。(当我们使用数据库查询某个关键字时,我们的查询效率会比没有使用索引的要快)这是使用索引最主要的原因。
通过创建唯一索引可以保证数据库表中每一行数据的唯一性。()
可以给所有的 MySQL 列类型设置索引。
在实现数据的参考完整性方面可以加速表与表之间的连接。
在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间
缺点:
当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。
创建和维护索引的时间增加了,同时占用硬盘空间。(公司在提示性能和升级磁盘之间会选择前者)
6.索引在什么情况下会失效
1. 不使用索引列进行查询:索引只能在使用 索引列(索引的最左列或最左前缀)作为查询条件时才能起作用。如果查询中没有使用索引列,那么索引将无法生效,数据库将会执行全表扫描 2. 对索引列进行了函数操作:对索引列进行 函数操作(如函数、运算符、类型转换等)会导致索引失效,因为函数操作可能会改变列的值,使得索引无法直接匹配查询条件 3. 使用了索引列的部分进行范围查询:一般情况下,当使用索引列进行范围查询(如`>`、`<`、`BETWEEN`等)时,索引仍然可以起作用。但如果在范围查询中使用了索引列的部分进行了运算或函数操作,将导致索引失效 4. 数据表过小:如果数据表的大小非常小,如只有几行数据,数据库通常会选择忽略索引,并直接进行全表扫描来获取数据,因为通 过索引的查找开销可能会大于直接全表扫描的开销 5. 索引选择性太低:选择性是 指索引列不同取值的唯一性程度。如果索引列的选择性非常低,即索引列的取值重复较多,那么索引的效果将降低,数据库可能会选择放弃使用索引而进行全表扫描 6. 统计信息不准确:数据库依赖于统计信息来估计查询成本,选择执行计划。如果统计信息不准确或过时,可能会导致数据库做出错误的执行计划选择,使得索引失效 7. 数据页分散程度高:如果索引的数据页分散程度高,即索引中的数据在物理上存储非常分散,需要进行大量的磁盘IO操作来获取索引数据,可能会导致索引效率低下 8.like以通配符%开头索引失效
7.索引的类别
1. 唯一索引(Unique Index):
保证索引列的唯一性,即索引列的值在整个表中是唯一的
语法:
CREATE UNIQUE INDEX index_name ON table_name (column1, column2, ...);
2. 主键索引(Primary Key Index):
用于定义表的主键,确保索引列的唯一性,并且不允许为空
语法:
CREATE TABLE table_name ( column1 datatype PRIMARY KEY, column2 datatype, ... );
或者:
ALTER TABLE table_name ADD PRIMARY KEY (column1);
3. 聚集索引(Clustered Index):
物理上将数据行按照索引的顺序进行存储,并且一个表只能有一个聚集索引。在大部分数据库管理系统中,主键索引默认就是聚集索引
创建主键索引时,聚集索引将会被自动创建
4. 非聚集索引(Non-clustered Index):
在单独的数据区域存储索引的数据,并在叶子节点上保存指向实际数据行的引用。一个表可以有多个非聚集索引
语法:
CREATE INDEX index_name ON table_name (column1, column2, ...);
5. 全文索引(Full-text Index):
用于全文搜索,可以在文本数据(如文章、描述等)中快速找到匹配的词语或短语
语法:
CREATE TABLE table_name ( column1 datatype, column2 datatype, ... FULLTEXT (column1, column2, ...) );
或者:
ALTER TABLE table_name ADD FULLTEXT (column1, column2, ...);
6. 复合索引(Composite Index):
由多个列组合而成的索引,可以对多个列进行查询和排序,提高多列条件查询的性能
语法:
CREATE INDEX index_name ON table_name (column1, column2, ...);
8.索引的类型
1. B-树索引(B-Tree Index):
是最常见的索引类型,在MySQL中被广泛使用。B-树索引适用于等值查询、范围查询和排序,它采用平衡树的数据结构,可以高效地支持数据的快速查找
2. 哈希索引(Hash Index):
基于哈希表实现的索引,适用于等值查询,对于范围查询和排序性能较差。哈希索引将数据存储为哈希值和链表的形式,可以在O(1)的时间复杂度内找到指定的值
3. 有序索引(Ordered Index):
在某些存储引擎中,也可以称为聚集索引(Clustered Index)。有序索引是按照数据行的逻辑顺序存储数据的索引,通常与数据行存储在一起,因此可以加快范围查询和排序的性能
4. 全文索引(Full-text Index):
用于全文搜索,在MySQL中可以使用全文索引进行对文本数据的高效搜索,支持关键字查询、短语匹配和布尔运算等
5. 空间索引(Spatial Index):
用于处理空间数据类型(如地理信息、坐标等)的索引,提供高效的空间查询和分析功能
6. 前缀索引(Prefix Index):
对索引列的前缀进行索引,适用于长字符串类型的列或者大文本字段,可以减少索引的存储空间和提高查询性能