在数据库管理中,视图和索引是两种关键工具,它们各自发挥独特的作用以优化数据查询和管理。视图通过简化复杂查询、提高数据安全性和提供数据抽象,帮助用户轻松访问数据。而索引则通过加速查询、确保数据唯一性以及优化排序和分组操作,显著提升数据库性能。理解和合理运用这两者,对数据库系统的高效运行至关重要。
目录
一、视图概念(面试)
二、视图的作用(面试)
三、视图的创建和使用
3.1 定义视图
3.2 查看视图
3.3 删除视图
3.3 性能问题
四、索引
4.1 引入索引的原因(面试题)
4.2 索引是什么(面试题)
4.3 索引为什么选择b+树(面试题)
4.4 测试索引
4.5 面试题
一、视图概念(面试)
在MySQL中,视图(View)是一种虚拟表。它本质上是基于一个或多个表的查询结果,并以表的形式展示出来。视图并不实际存储数据,而是存储查询语句,当你访问视图时,MySQL 会执行这条查询语句并返回结果。
二、视图的作用(面试)
- 简化复杂的sql操作,在编写查询后,可以方便的重用它而不必知道它的查询细节。
- 重复使用该sql语句。
- 使用表的组成部分而不是整个表。
- 保护数据,可以给用户授予表的特定部分的访问权限而不是整个表。
- 更改数据格式和表示。
视图在数据库管理和操作中有许多重要的作用:
简化复杂查询:
- 通过创建视图,可以将复杂的查询逻辑封装在视图中。用户在需要使用这些复杂查询时,只需简单地查询视图,而不需要重复编写复杂的SQL代码。
- 例如,如果你经常需要对多个表进行联合查询,可以创建一个视图来封装这些联合查询。
提高数据安全性:
- 视图可以限制用户访问特定的数据。通过视图,你可以只展示数据表中的某些列或行,而隐藏其他部分,从而保护敏感数据。
- 例如,你可以创建一个视图,只显示员工的名字和部门,而不包括工资信息,这样可以限制普通用户对工资信息的访问。
数据独立性:
- 视图可以屏蔽底层表结构的变化,使得应用程序代码对表结构的变更不敏感。即使底层表结构发生变化,只要视图定义不变,应用程序代码也无需修改。
- 例如,如果你对原始表的结构进行了调整,可以通过调整视图定义来保证原有的查询语句仍然可以正常工作。
简化权限管理:
- 通过视图,你可以为用户分配更细粒度的权限。你可以授予用户对视图的访问权限,而不需要授予他们对底层表的访问权限,从而实现更精细的权限控制。
- 例如,你可以创建一个视图,只展示特定用户权限范围内的数据,并将访问权限分配给这些用户。
三、视图的创建和使用
3.1 定义视图
定义视图建议以"_v"开头,create view 视图名 as select语句;
3.2 查看视图
- show tables; 默认会显示表和视图,但不能区分。
- show full tables; 会显示表和视图的类型
3.3 删除视图
3.3 性能问题
因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。如果是多 个联结和过滤创建了复杂的视图或者嵌套了视图,可能会出现性能下降。即先在基本表中进行查询,然后再在里面进行二次查询。
四、索引
4.1 引入索引的原因(面试题)
在MySQL中,索引是一种用于提高数据库查询速度的数据结构。它类似于一本书的目录,通过在表中为一个或多个列创建索引,可以大大加快数据检索的速度。就好像在图书馆查找一本书的过程。
4.2 索引是什么(面试题)
索引是一种特殊的文件,它包含着对数据表里所有记录的引用指针。简单讲,就像一本书前面的目 录, 能加快查询速度。
- 索引是帮助mysql高效获取数据的数据结构
- 索引存储在文件系统中
- 索引的文件存储形式与存储引擎有关,存储引擎的数据结构是B+树
4.3 索引为什么选择b+树(面试题)
可以考虑作为索引的数据结构有如下几种,下面介绍下不同数据结构的特点:
- hash表
- 二叉树
- b树
- b+树
使用hash表的缺点: 1)hash存储需要将所有的数据文件添加到内存,浪费空间 2)如果是等值查询,hash很快,但实际工作中范围查找更多,而不是等值查询,所以hash就不合适 了
4.4 测试索引
在c2024db数据库中创建表 test_index表,表只有一列,运行程序向表中插入1万条数据,都是字符串,对比不使用索引和使用索引的情况下,查询某一条记录所花费的时间。
1、创建表:
2、运行如下程序向表中插入1万条数据:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <mysql/mysql.h>int main()
{//1、创建连接句柄MYSQL mysql_con;//句柄实际是一个结构体//2、初始化连接句柄MYSQL*mysql=mysql_init(&mysql_con);if(mysql==NULL){printf("mysql init err\n");exit(1);}//3、连接数据库服务端:连接句柄、用户名字、密码、ip地址、端口、数据库名字、标志位给0,指针给NULLmysql=mysql_real_connect(mysql,"127.0.0.1","root","111111","c2024db",3306,NULL,0);if(mysql==NULL){printf("连接失败\n");exit(1);}printf("连接成功\n");//4、循环插入10000条数据char buff[128]={0};for(int i=0;i<10000;i++){sprintf(buff,"insert into testindex value( ' index-%d')",i) ;if (mysql_ query (mysql,buff)!=0){printf("插入失败\n");exit(1) ;}}//5、关闭连接mysql_close(mysql);exit(0);
}
3、 开启运行时间监测
4、查找一条数据
5、为表test_index的title列创建索引
6、执行查询语句后,查看执行时间
4.5 面试题
1、索引未命中
在表的某一列加上索引,然后查询时用的是没加索引的那一列进行查询,这就叫索引未命中,就是查询的时候,并没有使用所加的索引。
2、是不是给所有列加上索引就可以提高效率?
不是这样的,因为创建索引时,要给加上索引的那一列创建b+树,所以每一列都要创建b+树,虽然查询很快,但是插入数据时很麻烦,插入一行数据,全部的b+树都要添加数据。所以我们一般给查询比较多的那一列加上b+树。
至此,数据库第四节就已经介绍完毕,感谢大家的阅读,更多精彩内容见后期,下期再见!