【D1n910】(23/42) C++语言程序设计 - MySQL数据库学习笔记 2.6 索引、视图
正常操作,正常分析,大家好,我是D1N910,这是我观看【MySQL数据库】C++语言程序设计 - MySQL数据库的学习笔记。

之前的笔记内容请看我的专栏。这里便不再累述了。

Unit12 索引
01、索引
02、视图
01)索引
1、索引的本质是什么?

索引就是数据库中的表的一些值的复制。这些值称为索引的关键字
2、MySQL数据库中,数据是如何检索的?
MySQL 先按照索引关键字的值在索引表中查找,如果能找到,则能够直接定位到数据所在的起始地方(这里需要 计算机组成原理、操作系统 的知识)。如果没有找到,那么需要进行全表扫描,去查找到对应的数据。
这里还是以字典查字为例子。如果我们知道一个英文字或者中文拼音、部首(相当于关键字),那么可以在比较短的时间内找到关键字,从而知道至少是从第几页开始检索!否则我们要从第一页开始找数据。
3、一个数据库只能创建一个索引吗?
—个数据库表呢可以创建多个索引
4、索引可以是字段的组合吗?
我们在创建索引的时候是可以是多个字段的组合的,这种情况称为复合索引。
无论索引的关键字是一个字段还是多个字段的组合,这些字段必须来自于同一张表。
关键字值必须是同一张表中相应字段值的拷贝。
数据库为了提高查询索引的效率,会对索引进行排序。
5、可以跨表创建索引吗?(创建一张索引,里面的字段是来自多张表)
这是不允许的。索引字段必须来自于同一张表。
6、索引需要额外的存储空间吗?
这是一定需要的。我们字典前边加了这些呢查询的方式的这些目录一样。(类似操作系统-分页查询。)
数据库表的索引l关键字呢会经过排序后存储在外部存储器里边,为了提高效率,索引关键字经常是排序的。
索引 ↔️ 日常使用的目录
索引关键字的选取原则
表的某个字段值的离散度越高,该字段越适合选作索引的关键字。
这里指重复的比较少。比如说呢像性别字段就不适合创建使用它去创建索引,它的取值只有两种。如果是身份证ID就很适合,因为是唯一的。
占用存储空间少的字段更适合选作索引的关键字。
能用短的就不用长的,比如我们只有六十万人,那么用唯一序号的话,会比用身份证号码短很多。
存储空间固定的字段更适合选作索引的关键字。
比如 char 型就比varchar 型好。因为 char 型是定长的。如果学过计算机组成原理,就可以知道这样方便物理地址连续查找。
where子句中经常使用的字段、groud by分组字段或older by 排序字段、两个表的连接字段应该创建索引。
更新频繁的字段不适合创建索引,不会出现在where子句中的字段不应该创建索引。
最左缀原则。
尽量使用前缀索引。
指我们在索引时,并不是把所有字段的值整体作为它的索引的关键字。类似我们查字典中查字典的时候所采用的部首检字法。我们先找到部首,然后结合它剩余的部分的笔画去查找该字所在的页码。
对于数据库而言,如果说索引中关键的可以呢是索引关键字。
PS:索引选择不好,会造成时间和空间的浪费,造成增删改查时候效率降低。
索引和约束
系统会自动为主键、唯一和外键字段创建聚集索引
回顾约束:主键约束、唯一性约束、默认约束、检查约束、非空约束以及外键约束
主键约束、唯一性约束以及外键约束与索引联系紧密
约束:主要用于保证业务逻辑操作时数据的完整性;
索引:将关键字数据以某种数据结构的方式存储到外存
一个聚集索引的名字和主键约束名相同 —— primary
一个唯一性索引的名字和唯一性约束名相同
创建外键约束的同时会自动创建一个普通索引,索引名与外键名相同
MySQL中,删除了唯一性索引以后对应的唯一性约束也将自动删除。
下面我们做个测试,下面的创建很多语法后面会讲,实际上掌握一定的变成知识也能看得懂,先用着。
因为是一百万条数据,所以创建的时候要非常久,大概10分钟 —— 但是我的电脑还蛮好的,
用了一分半钟多。
这么看的话确实是有了
查看一下表结构
我们先用id查第五十万条数据,啪一下就出来了,很快啊。只用了0.00 sec。我的是苹果m1芯片的系统,基本上是一下就出了。因为太快了,所以只展示 0.00 sec。
现在改成用uid去查询,因为uid没有建立索引,所以是一行一行去查的。
稍微等了一下。速度上是有影响了。
稍微等了一下。速度上是有影响了。
创建索引
创建索引的方式有两种:创建表的同时创建索引、在已有表上创建索引
创建表的同时创建索引
语法:
在最后写上约束条件,中括号的是可选项,unique|fultext都不写的话是普通索引;
有 unique 是唯一索引;
有 fultext 是全文索引;
index 索引的关键字;
最后是我们创建的索引名和索引的字段名;
长度,选择前多少个字符去创建索引,即前缀索引
在已有表上创建索引
语法:
这里比上面多的一个内容就是要说明在那个表上建立索引。
任务:在已有表上创建索引
上面会拷贝现有的 student 的表结构和数据到 stu 中。
前情提要:如果只是想拷贝表结构,则用 like 关键字。 e.g.
我们可以看到 stu 表是没有索引的,因为复制的时候唯一、非空等都不会复制过来。
现在在这个 stu 表上添加索引。
查看到 student_no 现在增加了 PRI 在 Key 处。现在已经创建好了。
查看索引
语法
show index from 表名\G;
示例
show index from student\G;
这里还是用 show,然后 \G 是为了说明数据展出时是纵向展示结果

Non_unique: 0 # 即说明不是唯一的为0,即就是唯一的,0代表真,1代表假。我们刚刚创建的是 unique 的,是唯一的。
如果可以有重复值,比如普通索引,那么这里就是1。
Seq_in_index # 索引的序列号,这里是从1开始
跟着是列和字段的名称
Collation: A #指的是索引的存储方式,a即 升序,NULL 则无分类
Cardinality: 6 #索引中唯一值的估计数量
Sub_part: NULL #长度,选择前多少个字符去创建索引,即前缀索引,如果没有,则就是 NULL
Packed: NULL # 表示如何被压缩,NULL 表示没有被压缩
Null: # 字段是否允许有空值,允许则为 Yes
Index_type: BTREE #这里的意思是使用树的方式去创造索引
下面我们再观察下之前创建的几个表
学生表
可以看到 student_no 主键和 class_no 外键
这里可以看到出来了两行的索引说明。这可以看到 class_no 的 Non_unique 是 1,实际上就是不唯一。
考虑到一些索引添加了不仅没能提高查找效率,反而降低了,那么要考虑删除索引。
删除索引
语法
示例
现在看到是没有索引了
02)视图 view
创建视图
视图中保存的仅仅是一条select语句,该select语句的数据源可以是基表,也可以是另一个视图。所以视图是虚表。当数据源发生变化,对应视图也会发生变化。
创建视图的语法格式如下:
create view 视图名[(视图字段列表)]
as
select语句;
视图字段列表 就是将来进入视图的时候,能看到的字段。通过这样的方式可以隐藏原始表的列表。
注:视图是引用基表的数据,如果视图的改变了,基表的也会改变的!
执行SQL
现在我们进行常用操作,比如查询。能看到只有三项。
尝试插入数据于视图,发现原表也改变了。
修改、删除等都是会同步的。这里要注意,操作时使用的字段名应该是视图中的字段名,否则会报错。
当视图的数据不是来自一张表,而是来自多张表,那么可能就不能进行增删改了。
下面创建表
下面创建视图
尝试插入数据于视图
失败了
尝试删除也提示不能删除 join view 的数据
尝试 update 成功了
不过可以看到这种情况虽然成功了,但是看起来是非常怪的,比如实际上cls就没修改。
以后不要对视图做这样的操作了。
查看视图
使用查看表结构的方式查看视图的定义
desc 视图名;
MySQL命令 “show tables;"
MySQL系统数据库information_schema的views表存储了所有视图的定义,使用下面的
select语句可以查看所有视图的详细信息
select * from information_schema.views\G;
作用
使操作变得简单
避免数据冗余
增强数据安全性
提高数据的逻辑独立性
删除视图
如果某个视图不再使用,可以使用drop view语句将其删除,语法格式如下:
drop view 视图名;
>例如,删除available_course_view视图,可以使用下面的语句:

恭喜我们,掌握了数据库表的视图部分!
我们的学习进度为 23/42!
未完!继续!