大家好,又见面了,我是你们的朋友全栈君。
MySQL索引及视图
索引
索引是一种特殊的文件(INNODB数据表上的索引是表空间上的一个组成部分),它们包含着对数据表里所有记录的引用指针.
索引可以加快数据检索性能, 但会使数据修改操作变慢,每修改一次数据记录, 索引就必须刷新一次. 另外, 索引会在硬盘上占用相当大的空间.
为了弥补这一缺点, 许多SQL命令引入了delay_key_write项, 这个项的作用是暂时制止MySQL在该命令每插入一条新记录和每修改一个数据之后立即对索引进行刷新, 对索引的刷新必须等到全部记录插入或修改完毕后再进行.
MySQL把同一个数据表里的索引总数限制为16个.
索引实质是数据库表的字段值的复制, 该字段值被称为索引的关键字.
设计索引的原则
- 主键字段一定要建立索引.
- 表的某个字段值离散值越高, 该字段越适合选作索引的关键字.
- 占用存储空间少的字段更适合选作索引的关键字.
- 频繁作为where查询条件的字段应该创建索引, 分组字段或者排序字段应该创建索引, 外键应该创建索引.
- 更新频繁的字段不适合创建索引.
- 出现在select子句后的字段不应该创建索引.
索引分类
根据索引的存储结构不同将其分为两类: 聚簇索引和非聚簇索引.
主键索引也称聚簇索引, 除主键索引外的其它索引称为非聚簇索引.(即使一张表没有设置主键, MySQL也会为该表创建一个”隐式”的主键.)
-
主键索引
为数据表中的主键字段创建一个索引, 这个索引就是所谓的”主索引”.主索引在定义时使用的关键字是primary key. -
普通索引
普通索引(由关键字key或index定义的索引)的任务是加快对数据的访问速度, 因此, 应该为那些经常出现在查询条件(where column = )或排序条件(order by column)中的字段创建索引. -
唯一索引(unique index)
索引字段的值必须唯一, 但允许有空值(注意和主键不同). 如果是组合索引, 则组合值必须唯一. -
复合索引(组合索引)
索引可以覆盖多个字段, 例如index(columnA, columnB)索引. 这种用法仅适合于在复合索引中排列在前的数据列组合. 例如index(a, b, c)可以当作a或(a, b)的索引来使用, 但不能当作b或c或(b, c)的索引来使用. -
全文索引(fulltext index)
为blob和text类型的字段创建索引时, 对于超大文本的索引要使用全文索引, 在生成全文索引时, MySQL将把在文本中出现的所有单词创建一份清单, 查询操作将根据这份清单去检索有关的数据记录. -
短索引
如果对字符串列进行索引, 应该指定一个前缀长度, 尽可能节省索引空间, 也使查询更快.
创建索引
- 方法一:
create table 表名(
字段名1 数据类型 [约束条件],
…,
[其它约束条件],
…,
[unique | fulltext] index [索引名](字段名 [(长度)] [asc | desc])) engine = 存储引擎;说明:
unique用来指定创建的索引类型是唯一索引;
fulltext用来指定创建的索引的类型是全文索引;
[asc | desc]用来指定索引字段的排序方式, asc是升序, desc是降序.默认升序.
- 方法二:
create [unique | fulltext] index 索引名 on 表名(字段名 [asc | desc]);
或者
alter table 表名 add [unique | fulltext] index 索引名 (字段名 [asc | desc]);
删除索引
为一张表创建太多的索引会降低数据库的性能, 此时可以考虑将索引删除:
drop index 索引名 on 表名;
索引对数据查询的影响
- 索引对单张表查询的影响
索引是用来快速找出在某个字段上的特定值的记录.
如果数据表没有添加索引, 那么MySQL不得不从记录的第一条开始查找直到读完整张表才能查询出相关的数据, 表越大, 花费时间越多.
如果表对于查询的字段有一个索引, MySQL能快速到达一个位置去查找数据文件的中间, 没有必要遍历所有的数据, 那么查找的速度会快很多倍.
- 索引对多个表查询的影响
单表查询中使用索引消除了全表扫描, 极大地加快了搜索的速度.
在单表查询中, 每字段需要查看的值的数目就是表中的记录数目.
在多表查询中, 可能的组合数目极大, 因为这个数目为各表中记录数之积.
假如有三张未创建索引的表T1,T2,T3, 分别包含字段C1,C2,C3, 每个表中的记录数为1000行. 在无索引的情况下执行此查询, 找出所有组合以便得出与where子句相匹配的那些组合, 组合数目极可能是1000x1000x1000(10亿).
如果对每张表都创建索引, 就能加快查询进程, 查询过程如下:
1.先从T1中选择一行, 查看此行所包含的所有值.
2.使用T2的索引, 直接跳到T2中与T1的值相匹配的记录, 再利用T3的索引, 直接跳到T3中与T1的值相匹配的记录.
3.到T1的下一条记录并重复前面的过程, 直到T1中的所有记录被遍历一遍.
查询过程相当于对T1进行了一个完全扫描, 但在T2和T3上进行索引查找并直接取出值相等的记录. 此时查询要比没有索引时快很多倍.- 创建索引时要注意:
- 只有表或视图的所有者才能创建索引, 并可以随时创建.
- 对表中已依次排列的字段集合只能定义一个索引.
- 在创建聚集索引时, 将会对表进行复制, 对表中的数据进行排列, 然后删除原始的表. 因此数据库上必须有足够的空间, 以容纳数据副本.
- 使用create index语句创建索引时, 必须指定索引、表以及索引所引用的字段的名称.
- 创建索引时要注意:
视图
视图是一个虚拟表, 其内容由查询定义. 视图中的源数据都来自于数据库表, 数据库表称为基本表或者基表, 视图称为虚表.
视图由若干个字段以及若干条记录构成, 视图也可以作为select语句的数据源, 在某些特定条件下, 可以通过视图对表进行插入,更新和删除操作.
视图并不在数据库中以存储的数据值集的形式存在, 而且系统也不会在其它任何地方为标准视图存储数据, 而是在引用视图时动态生成.
视图是另一种在一个或多个数据表上观察数据的途径, 可以把数据视图看作一个能把焦点锁定在用户感兴趣的数据上的监视器, 用户看到的是实时数据.
视图常见示例:
- 基表的行和字段的子集
- 两个或多个基表的连接
- 两个或多个基表的联合
- 基表和另一个视图或视图的子集的结合
- 基表的统计概要
视图的作用
- 简化用户操作
- 增强数据安全性
- 避免数据冗余
- 提高数据的逻辑独立性
创建视图
视图保存的仅仅是一条select语句, 而select语句中的数据源既可以是基表, 也可以是另一个视图.
create view 视图名 [(视图字段列表)]
as
select 语句;说明:
select语句: 任意复杂的select语句, 通常不允许含有order by子句和distinct语句.
视图字段列表: 视图中的字段名, 可以在select语句中指派字段名, 如果未指派字段名, 则视图中的字段将获得与select语句中的字段相同的名称.
视图名: 视图的名称, 为了区分视图与基本表, 建议在视图名称的前缀或后缀处添加”view”.
使用视图
- 使用视图查询数据
视图可以限制用户只能访问数据库中的某些记录, 限制用户只查询表中某些字段的记录.
视图的查询转换为对基表的查询的过程为视图的消解(view resolution).
DBMS对视图进行查询时, 首先检查其有效性, 检查查询涉及的表, 视图是否在数据库中存在, 如果存在, 则从数据字典中取出查询涉及的视图的定义, 把定义中的子查询和用户对视图的查询结合起来, 转换成对基表的查询, 然后再执行这个经过修改的查询.
- 使用视图更新数据
更新视图包括数据插入(insert), 数据删除(delete), 数据修改(update).- 使用视图修改数据
update 视图名 set 字段名 = 字段值 where 查询条件;
- 使用视图删除数据
delete from 视图名 where 查询条件;
- 使用视图插入数据
insert into 视图名 values(‘值’, ‘值’, …);
通过视图执行数据更新操作最终要转换为对基表的更新操作. 因此, 使用视图需要注意以下几点:
- MySQL必须能够明确地解析对视图所引用的基表中的特定行所做的修改操作. 不能在一个语句中对多个基表使用数据修改语句. 在update或insert语句中的字段必须属于视图定义中的同一个基表.
- 对于基表中需更新而又不允许有空值的字段, 它们的值在insert语句或default定义中指定.
- 在基表的字段中修改的数据必须符合对这些字段的约束.
检查视图
MySQL中的视图分为普通视图和检查视图. 通过检查视图更新基表的数据, 只有满足检查条件的更新语句才能成功执行.
在定义视图时, 加上with check option语句, 这样在视图上修改数据时, DBMS会进一步检查视图定义中的条件.
create view 视图名 [(视图字段列表)]
as
select 语句
with [local | cascaded] check option;说明:
with check option: 表示对视图进行update, insert, delete操作时要保证更新, 插入, 删除的记录满足视图定义中的谓词条件(即查询中的条件表达式).
local | cascaded: local为本地检查视图; cascaded为级联检查视图,级联检查视图在视图的基础上再次创建另一个视图.
查看视图的定义
查看视图的定义主要是查看数据库已存在的视图的定义, 状态, 语法等信息.
有以下4种方法:
- show create view 视图名;
- desc 视图名;
- “show tables;”命令不仅显示当前数据库中的所有数据表, 也可以显示数据库中所有视图.
- MySQL系统数据库information_schema的view表存储了所有视图的定义, 使用select语句查询该表的所有记录, 也可以查看所有视图的详细信息.
select * from information_schema.view;
结尾符号可以是”;“或”\g”或者是”\G”, 结果显示方式会不同.
删除视图
基表删除后, 基于此基表创建的视图会失效但并不会自动删除, 用户应使用drop view语句将其一一删除.
drop view 视图名;
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163067.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...