MySQL索引及视图

文章目录

  • MySQL索引及视图
    • 索引
      • 设计索引的原则
      • 索引分类
      • 创建索引
      • 删除索引
      • 索引对数据查询的影响
    • 视图
      • 视图的作用
      • 创建视图
      • 使用视图
      • 检查视图
      • 查看视图的定义
      • 删除视图

索引

索引是一种特殊的文件(INNODB数据表上的索引是表空间上的一个组成部分),它们包含着对数据表里所有记录的引用指针.

索引可以加快数据检索性能, 但会使数据修改操作变慢,每修改一次数据记录, 索引就必须刷新一次. 另外, 索引会在硬盘上占用相当大的空间.

为了弥补这一缺点, 许多SQL命令引入了delay_key_write项, 这个项的作用是暂时制止MySQL在该命令每插入一条新记录和每修改一个数据之后立即对索引进行刷新, 对索引的刷新必须等到全部记录插入或修改完毕后再进行.

MySQL把同一个数据表里的索引总数限制为16个.

索引实质是数据库表的字段值的复制, 该字段值被称为索引的关键字.

设计索引的原则

  1. 主键字段一定要建立索引.
  2. 表的某个字段值离散值越高, 该字段越适合选作索引的关键字.
  3. 占用存储空间少的字段更适合选作索引的关键字.
  4. 频繁作为where查询条件的字段应该创建索引, 分组字段或者排序字段应该创建索引, 外键应该创建索引.
  5. 更新频繁的字段不适合创建索引.
  6. 出现在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上进行索引查找并直接取出值相等的记录. 此时查询要比没有索引时快很多倍.

    • 创建索引时要注意:

      1. 只有表或视图的所有者才能创建索引, 并可以随时创建.
      2. 对表中已依次排列的字段集合只能定义一个索引.
      3. 在创建聚集索引时, 将会对表进行复制, 对表中的数据进行排列, 然后删除原始的表. 因此数据库上必须有足够的空间, 以容纳数据副本.
      4. 使用create index语句创建索引时, 必须指定索引、表以及索引所引用的字段的名称.

视图

视图是一个虚拟表, 其内容由查询定义. 视图中的源数据都来自于数据库表, 数据库表称为基本表或者基表, 视图称为虚表.

视图由若干个字段以及若干条记录构成, 视图也可以作为select语句的数据源, 在某些特定条件下, 可以通过视图对表进行插入,更新和删除操作.

视图并不在数据库中以存储的数据值集的形式存在, 而且系统也不会在其它任何地方为标准视图存储数据, 而是在引用视图时动态生成.

视图是另一种在一个或多个数据表上观察数据的途径, 可以把数据视图看作一个能把焦点锁定在用户感兴趣的数据上的监视器, 用户看到的是实时数据.

视图常见示例:

  1. 基表的行和字段的子集
  2. 两个或多个基表的连接
  3. 两个或多个基表的联合
  4. 基表和另一个视图或视图的子集的结合
  5. 基表的统计概要

视图的作用

  • 简化用户操作
  • 增强数据安全性
  • 避免数据冗余
  • 提高数据的逻辑独立性

创建视图

视图保存的仅仅是一条select语句, 而select语句中的数据源既可以是基表, 也可以是另一个视图.

create view 视图名 [(视图字段列表)]
as
select 语句;

说明:
select语句: 任意复杂的select语句, 通常不允许含有order by子句和distinct语句.
视图字段列表: 视图中的字段名, 可以在select语句中指派字段名, 如果未指派字段名, 则视图中的字段将获得与select语句中的字段相同的名称.
视图名: 视图的名称, 为了区分视图与基本表, 建议在视图名称的前缀或后缀处添加"view".

使用视图

  • 使用视图查询数据
    视图可以限制用户只能访问数据库中的某些记录, 限制用户只查询表中某些字段的记录.
    视图的查询转换为对基表的查询的过程为视图的消解(view resolution).
    DBMS对视图进行查询时, 首先检查其有效性, 检查查询涉及的表, 视图是否在数据库中存在, 如果存在, 则从数据字典中取出查询涉及的视图的定义, 把定义中的子查询和用户对视图的查询结合起来, 转换成对基表的查询, 然后再执行这个经过修改的查询.
  • 使用视图更新数据
    更新视图包括数据插入(insert), 数据删除(delete), 数据修改(update).

    1. 使用视图修改数据

    update 视图名 set 字段名 = 字段值 where 查询条件;

    1. 使用视图删除数据

    delete from 视图名 where 查询条件;

    1. 使用视图插入数据

    insert into 视图名 values(‘值’, ‘值’, …);

通过视图执行数据更新操作最终要转换为对基表的更新操作. 因此, 使用视图需要注意以下几点:

  1. MySQL必须能够明确地解析对视图所引用的基表中的特定行所做的修改操作. 不能在一个语句中对多个基表使用数据修改语句. 在update或insert语句中的字段必须属于视图定义中的同一个基表.
  2. 对于基表中需更新而又不允许有空值的字段, 它们的值在insert语句或default定义中指定.
  3. 在基表的字段中修改的数据必须符合对这些字段的约束.

检查视图

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种方法:

  1. show create view 视图名;
  2. desc 视图名;
  3. "show tables;"命令不仅显示当前数据库中的所有数据表, 也可以显示数据库中所有视图.
  4. MySQL系统数据库information_schema的view表存储了所有视图的定义, 使用select语句查询该表的所有记录, 也可以查看所有视图的详细信息.

    select * from information_schema.view;
    结尾符号可以是";“或”\g"或者是"\G", 结果显示方式会不同.

删除视图

基表删除后, 基于此基表创建的视图会失效但并不会自动删除, 用户应使用drop view语句将其一一删除.

drop view 视图名;

MySQL索引及视图相关推荐

  1. MySQL索引、视图创建与管理操作实验

    实验4:索引.视图创建与管理操作实验 一.实验目的: 理解索引的概念与类型. 掌握创建.更改.删除索引的方法. 掌握维护索引的方法. 理解视图的概念. 掌握创建.更改.删除视图的方法. 掌握使用视图来 ...

  2. 实验七 索引和视图的操作Mysql索引和视图

    实验七 索引和视图的操作 [实验目的]:①学会使用update.delete.insert命令 ②掌握视图的建立.修改.更新和删除. ③掌握索引的创建和使用. [实验内容]:相关命令写在作业本上. 1 ...

  3. MySQL— 索引,视图,触发器,函数,存储过程,执行计划,慢日志,分页性能...

    一.索引,分页性能,执行计划,慢日志 (1)索引的种类,创建语句,名词补充(最左前缀匹配,覆盖索引,索引合并,局部索引等): import sys # http://www.cnblogs.com/w ...

  4. mysql基础(九) 索引和视图

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  5. access 导入 txt sql语句_从零开始学习 MySQL 系列索引、视图、导入和导出

    阅读本文大概需要 8 分钟 前言上篇文章我们学习了数据库和数据表操作语句,今天我们学习下数据库索引,视图,导入和导出的知识.作为基础篇,不会涉及到关于索引和视图的高级应用和核心概念,但是基本操作大家会 ...

  6. mysql导入dat文件_从零开始学习 MySQL 系列--索引、视图、导入和导出

    前言 上篇文章我们学习了数据库和数据表操作语句,今天我们学习下数据库索引,视图,导入和导出的知识. 作为基础篇,不会涉及到关于索引和视图的高级应用和核心概念,但是基本操作大家会了解,尤其是关于索引的内 ...

  7. MySQL中索引与视图的用法与区别详解

    索引与视图是我们在日常使用mysql必不可少的一部分,最近在学习中看到一本书中关于这方法写的不错,所以这篇文章主要给大家介绍了关于MySQL中索引与视图的使用与区别的相关资料,需要的朋友可以参考借鉴, ...

  8. bcp out 带列名导出_从零开始学习 MySQL 系列索引、视图、导入和导出

    阅读本文大概需要 8 分钟 前言上篇文章我们学习了数据库和数据表操作语句,今天我们学习下数据库索引,视图,导入和导出的知识.作为基础篇,不会涉及到关于索引和视图的高级应用和核心概念,但是基本操作大家会 ...

  9. MySQL教程——2 中级篇(索引、视图、存储过程)

    1. Linux 系统安装MySQL 1.1 下载Linux 安装包 https://dev.mysql.com/downloads/mysql/5.7.html#downloads 1.2 cent ...

最新文章

  1. [Core Java® for the Impatient]重载Java2
  2. 【API知识】ElementUI一些问题的解决方案
  3. googleapiclient.discovery
  4. XI 安装MS SQLSERVER JDBC 驱动
  5. linux内核笔记-内核同步
  6. Aveva Marine 新建项目001
  7. SQLServer IP不能登录问题解决
  8. 大数据在零售业的应用
  9. hough变换检测直线 matlab,Hough变换直线检测MatLab代码 | 学步园
  10. 高通QCA9531方案定制开发主板300M 2.4G无线模块面板AP wifi路由模块 用的是什么网络变压器
  11. 2022百度网盘无限扩容方法技术分享
  12. 手机怎样和宽带连接无线路由器设置路由器连接服务器,手机如何设置路由器?...
  13. Echarts图表隐藏X轴和Y轴
  14. linux cp omitting,Linux复制文件时出现omitting directory错误解决方法(图)
  15. html 标签英文全称,html标签英文全称
  16. Nape 碰撞检测事件 笔记
  17. 电脑休眠后无法唤醒怎么办?
  18. 什么是邓氏编码DUNS NUMBER?
  19. vue+elemenUI项目,仿照京东商城,完成电商网站的订单中心
  20. Datadog:APM和分布式跟踪的新Java支持

热门文章

  1. 麒麟985和麒麟990有什么区别(手机常见问题)
  2. PHP民俗文化管理系统,中国民俗文化
  3. 使用vscode开发,使用插件记录
  4. [附源码]java毕业设计家政管理系统
  5. bixby怎么编程_三星的Bixby很烂。 这是如何将其关闭。
  6. stm32将flash虚拟成U盘来下载程序
  7. hadoop面试题 5 ---有用
  8. 新生研讨课:利用OpenCV处理带有水印的图片的调研报告
  9. 接口测试是什么?为什么要做接口测试?
  10. vue3 kepp-alive 的使用