MySQL-视图和索引

纵然是瞬间 提交于 2020-03-16 09:52:44

一、视图

视图是从一个或多个表中导出的表,是一种虚拟的表,其内容由查询语句定义。

视图是逻辑上来自一个或多个表的数据集合

视图一旦定义,就可以像表一样进行查询、修改和删除。

对视图引用的基础表来说,视图的作用类似于筛选。

视图的数据来自定义视图查询时引用的表,且在引用视图时动态生成。

为什么使用视图?

  1. 限制其他用户对数据库表的访问,因为视图可以有选择性的显示数据库表的一部分
  2. 容易实现复杂的查询
  3. 对于相同的数据可以产生不同的视图

1、创建视图

Create view 视图名 [(列名1,列名2)]  as  select语句

创建视图时,所引用的表尽量<=3,为保证执行效率

范例1:CREATE VIEW emp11 AS SELECT * FROM emp;

范例2:CREATE VIEW emp10 as SELECT * FROM emp WHERE deptno=10;

范例3:CREATE VIEW emp20(no,name) as SELECT empno, ename FROM emp;

范例4:CREATE VIEW emp02(no,name,deptno,dname) as

SELECT empno, ename, d.deptno,dname

FROM emp e, dept d

WHERE e.deptno = d.deptno

AND loc = 'CHICAGO';

范例5:创建一个统计员工表的视图,包括部门名称、部门员工总数

CREATE VIEW emp03(dname,count) AS

SELECT dname, COUNT(empno)

FROM emp e RIGHT OUTER JOIN dept d

ON e.deptno = d.deptno

GROUP BY dname;

扩展,视图创建语句的完整写

Create [algorithm={undefined|merge|temptable}] view 视图名 [(列名1,列名2)] as select语句 [ with [ cascaded | local ] CHECK OPTION ]

[ with  [ cascaded | local ]:决定了是否允许更新数据使记录不再满足视图的条件

Cascaded(默认):必须满足所有针对该视图的所有视图的条件才可以更新

Local:只要满足本视图的条件就可以更新

Algorithm:表示视图选择的算法

Undefined:表示MySQL将自动选择所要使用的算法

Merge:表示将使用视图的语句与视图定义结合起来,使得视图定义的某一部分取代语句的对应部分

Temptable:将视图的结果存入临时表,然后使用临时表来执行语句

范例:

CREATE OR REPLACE

ALGORITHM = MERGE VIEW view3

AS SELECT DNAME

FROM emp

WITH LOCAL CHECK OPTION;

说明:

  1. 只能在当前数据库汇总创建视图,在视图中最多只能引用1024列
  2. 不能再默认值、触发器的定义中引用视图
  3. 不能在视图上创建索引
  4. 如果视图引用的表被删除,则当使用该视图时则将返回错误;如果创建具有相同表的结构俩答题已删除的表,则视图可以继续使用,否则必须重新创建视图
  5. 如果视图中的某一列是函数、数学表达式、常量、或来自多个表的列名相同,则必须给列定义名字。
  6. 当通过视图查询数据时,MySQL不仅要检查视图引用的表是否存在,是否有效,而且要验证对数据的修改是否违反了数据的完整性约束。如果失败将返回错误信息;若正确,则把对视图的查询转换为对引用表的查询。
  7. 使用create view语句创建视图时,某些企业要求加上with check option参数;而且是要加上cascaded参数。理由是从视图上派生出来的新视图,更新新视图需要考虑其父视图的约束条件,这种方式比较严格,可以保证数据库的安全性。

 

2、查看视图

         1). Desc 视图名称;

         DESC emp04;   //查看视图的字段信息

         2). Show table status like ‘视图名’;

  SHOW TABLE STATUS LIKE 'emp04';   //查看视图的基本信息

  一般情况下,不推荐show table status like ‘视图名’,得到的值大多是null

         3). Show create view 视图名;

  SHOW CREATE VIEW emp04;   //查看视图的详细信息

3、在views表中查看视图详细信息

         当MySQL数据库管理系统创建成功后,系统会自动创建一个数据库information_schema,在该数据库中有一个数据表views,保存所有视图的定义,所以我们可以通过views表来查看视图的定义

         select * from information_schema.views;

4、删除视图

         语法:Drop view 视图名;

         范例:DROP VIEW emp03;

    范例:DROP VIEW emp20,emp11;

  批量删除以…开头的视图/

  SELECT CONCAT ( 'DROP VIEW ', TABLE_NAME, ';' )

  FROM information_schema.views

  WHERE TABLE_NAME LIKE 'emp%';

  然后复制以下所有代码,执行即可完成删除

5、修改视图

         1).使用alter view语句修改视图

语法:ALTER  VIEW 视图名 [ (列名) ]  AS  SELECT 语句

[ WITH  [ cascaded | local ]  CEHCK   OPTION ];

范例:ALTER  VIEW  dname01  AS  SELECT  *  FROM  emp;

         2).Create or replace view来修改视图

语法:CREATE OR REPLACE VIEW 视图名  [(列名)]

AS SELECT 语句 [WITH [cascaded|local] CHECK OPTION];

说明:使用该语句的时候需要注意的问题,若视图以及存在,则该语句对视图进行修改;若该视图不存在,则该语句创建视图

         范例:CREATE OR REPLACE VIEW dname01 AS SELECT * FROM emp;

         删除视图并不会删除数据,因为视图是基于数据库中的基表的虚表。

         修改视图是指修改数据库中已存在表的定义。

6、视图的应用

      1). 查询数据

         方法和表的查询一样

  范例:select * from emp03;

      2). 更新数据

  更新视图的方式有3种,插入、更新和删除

  范例:Update myemp set sal=100 where empno=7369;

  3). 删除数据

         语法:delete from 视图名 [where子句]

  4). 插入数据

         Insert into 视图名(列名1, 列名2)  values( 插入值 );

         当基本表的某些字段发生改变时,可以通过修改视图来保持视图与基本表之间的一致性

      说明:对视图的修改操作,最后都是实现在基本表上的记录。但是视图包含以下情况时,无法完成数据操作(更新删除插入等):

  a.视图中含有组函数(avg,count等)

  b.视图中包含union、union、distinct、group by和having关键字

  c.常量视图(create view vmy as select 1;)

  d.视图中的select子句还包含有子查询,如create view vmy as select (select ename from emp)

  e.由不可更新的视图导出的视图

  f.创建视图时,algorithm为template类型

  g.视图对应的表上存在没有默认值的列,而且该列并没有包含在视图里

  h.视图上的列不是基本表上 存在的列

  create or REPLACE view vmy(name) as select concat(ename,job) from emp;

  Update vmy set name=123456;     // Column 'name' is not updatable

范例1:创建一个视图,通过该视图可以查询到每个部门的部门名称和最低工资(ALGORITHM设置为merge,加上约束WITH LOCAL CHECK OPTION)

CREATE OR REPLACE

ALGORITHM = MERGE VIEW view3

AS SELECT DNAME, MIN(SAL)

FROM emp e RIGHT OUTER JOIN dept d

ON e.deptno = d.deptno

GROUP BY DNAME

WITH LOCAL CHECK OPTION;

 

二、索引

索引是一种特殊的数据库结构,可以用来快速查询数据库表中的特定记录。索引是提高数据库性能的重要方式。MySQL中,所有的数据类型都可以被索引

索引是创建在表上的,是对数据库表中一列或多列的值进行排序的一种结构

在MySQL中,索引是一个单独的、物理的数据库结构,是为了对表中的数据行检索而创建的一种分散存储结构。

表的存储有两部分组成,一部分是表的数据页面,另一部分就是索引页面

索引提高的是查询速率,对更新修改删除插入数据的速率会有负面影响,尤其影响插入速率。过亿的数据量,建议将此表建立为分表进行索引,否则或因数据量过大而达不到索引预期的效果。

1、存储引擎

存储引擎就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎简而言之就是指表的类型。数据库的存储引擎决定了表在计算机中的存储方式。

在Oracle和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySQL数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎,MySQL的核心就是存储引擎。

主要有InnoDB、MyISAM、MEMORY

MySQL5.7默认的默认的存储引擎是lnnoDB。使用MySQL命令set default_storage_engine=My ISAM;可以“临时地”将MySQL当前会话的存储引擎设置为MyISAM。

存储引擎可以定义每个表的最大索引数和最大索引长度,每种存储引擎对每个表至少支持16个索引,总索引长度至少为256字节。

修改引擎:Alter table 表名 engine=引擎名;

查看引擎:show engines; //查看MySQL中服务实例支持的存储引擎

查看表使用的存储引擎:show create table 表名;

Show table status from db_home where name = ‘表名’;(推荐使用)

2、索引的分类

  MySQL中支持6种索引:普通索引、唯一索引、全文索引、单列索引、多列索引、空间索引。

  普通索引:在创建索引时,不附加任何的限制条件。这类索引可以创建在任意的数据类型上,其值是否唯一和非空 由字段本身的完整性约束来决定。

  唯一索引:为了保证表或视图的每一行在某种程度上是唯一的,我们可以使用唯一索引。唯一索引值必须是唯一的,但是允许有空值。如果是多列索引,则列组合的值必须唯一。主键是特殊的唯一索引,但它不属于明文规定的索引,使用explain查询不出来

  全文索引(全文检索):利用算法智能分析出文本中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出搜索结果。目前,在 MySQL 中自带的是针对英文的全文检索,目前无法针对中文进行全文检索。如果想要对中文全文检索,可以使用Sphinx/Coreseek 技术来处理。

  单列索引:针对创建索引所在的列是在表的单个列上创建的索引。单列索引可以是普通索引、唯一索引或全文索引,只要保证索引对应一个字段就可以了。

  多列索引:在一个表的多个列上创建一个索引。多列索引可以是普通索引、唯一索引或全文索引。一个索引对应多个字段。

  空间索引:只能创建在空间数据类型上。MySQL的空间数据类型有:geomentry\point\linestring\polygon等。目前只有mylsam存储引擎支持空间索引,而且检索的索引列数不能为空。

3、创建索引

创建索引有三种方式,这三种方式分别是:创建表的时候创建索引,在已经存在的表上创建索引,使用 ALTER TABLE 语句来创建索引。

索引可以转化为约束,约束不可以转化为索引

  先删除约束再删除索引,先建立约束再建立索引

      a).在创建表的时候创建索引

  语法格式一:

CREATE TABLE  [IF NOT EXISTS] 表名(

列名   数据类型   列属性,

…,

[UNIQUE|FULLTEXT|SPATIAL] KEY INDEX(索引列(索引长度)ASC|DESC)

);

CREATE TABLE [IF NOT EXISTS] 表名(

列名 数据类型 列属性,

…,

[UNIQUE|FULLTEXT|SPATIAL] KEY INDEX|[PRIMARY KEY](索引列)

);

  语法格式二:

CREATE TABLE [IF NOT EXISTS] 表名(

列名 数据类型 列属性 [UNIQUE|FULLTEXT|SPATIAL] KEY|[PRIMARY KEY],

);

  创建普通索引

  范例:CREATE TABLE user1(

               id INT,

               name VARCHAR(20),

               psword VARCHAR(20),

               INDEX(id)

       );

    检索索引的使用:explain select * from uer1 where id=1;

    检索索引时,必须加上where条件(引用可能存在索引的列)

    在不损失精度的前提下,索引长度是越短越好

    说明:EXPLAIN 的作用是解释它如何处理 SELECT,提供有关表如何连接、连接的次序和应用哪些索引等。

    创建唯一索引

    CREATE TABLE user2(

        id INT PRIMARY KEY,

        name VARCHAR(20) UNIQUE KEY,

        psword VARCHAR(20)

  );

CREATE TABLE user3(

        id INT,

        name VARCHAR(20),

        psword VARCHAR(20),

       UNIQUE INDEX user3_id(id [desc|asc])

  );

  创建全文索引

  它是对文本类型进行索引,只能创建在char、varchar和text类型的字段上,且只有InnoDB存储引擎和MyISAM存储引擎支持全文索引。

  说明:在低版本 MySQL 数据库中,只有 MyISAM 存储引擎支持全文索引。但是高版本中,InnoDB 存储引擎和 MyISAM 存储引擎支持全文索引。

  CREATE TABLE user4(

          id INT PRIMARY KEY,

          name VARCHAR(20) UNIQUE KEY,

          psword VARCHAR(20),

         memo VARCHAR(20),

         FULLTEXT KEY(memo)

  )ENGINE=myisam DEFAULT CHARSET=utf8;

  创建单列索引

  CREATE TABLE user7(

       id INT,

       name VARCHAR(20),

       INDEX user7_name(name(5))

       );

  创建多列索引

  CREATE TABLE user8(

       id INT,

       name VARCHAR(20),

       psword VARCHAR(20),

       memo VARCHAR(20),

       INDEX index_up(name,psword)

       );

  创建空间约束

  只能在MyISAM存储引擎下使用,而且索引字段必须为非空约束。

  CREATE TABLE user9(

       id INT,

       spacename GEOMETRY NOT NULL,

       SPATIAL INDEX index_sp(spacename)

       )ENGINE=myisam;

      b).在已有表上创建索引

语法:Create [索引类型] INDEX 索引名 ON 表名|视图名(列名(索引长度) ASC|DESC);

范例1:CREATE INDEX index_emp_ename ON emp (ename);

范例2:CREATE UNIQUE INDEX index_em_job ON emp(job);

索引长度的设置,只有字符串类型才可以使用

  c).Alter语句添加索引

语法:Alter table 表名 add [索引类型] INDEX 索引名 (列名[(索引长度) ASC|DESC]);

范例:ALTER TABLE emp ADD UNIQUE INDEX index_emp_empno (empno);

  d).DROP语句删除索引

语法1:Drop index 索引名 ON 表名;

语法2:Alter table 表名 drop index 索引名; //不推荐

范例:DROP INDEX index_emp_empno ON emp;

索引名可以通过 show create查询出来

  e).修改索引

先删除,再创建

  f).使用索引的原则

1、为经常作为查询条件或连接的列创建索引;

2、使用唯一索引

3、使用短索引

4、利用最左前缀

5、不要过度索引(限制索引的数目)

6、InnoDB 表尽量指定主键

7、考虑在字段上进行的比较类型

8、删除不再使用或者很少使用的索引。

 

对test表中Name列的前6个字符以及telnum列的前8个字符组建联合索引

ALTER  TABLE  test  ADD  INDEX  idx_n_t(name(6),  telnum(8));

 

 

 

  作者:kerwin-chyl

  文章链接:https:////www.cnblogs.com/kerwin-chyl

  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!