MySQL-视图和索引
Posted Kerwin_chyl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL-视图和索引相关的知识,希望对你有一定的参考价值。
一、视图
视图是从一个或多个表中导出的表,是一种虚拟的表,其内容由查询语句定义。
视图是逻辑上来自一个或多个表的数据集合
视图一旦定义,就可以像表一样进行查询、修改和删除。
对视图引用的基础表来说,视图的作用类似于筛选。
视图的数据来自定义视图查询时引用的表,且在引用视图时动态生成。
为什么使用视图?
- 限制其他用户对数据库表的访问,因为视图可以有选择性的显示数据库表的一部分
- 容易实现复杂的查询
- 对于相同的数据可以产生不同的视图
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;
说明:
- 只能在当前数据库汇总创建视图,在视图中最多只能引用1024列
- 不能再默认值、触发器的定义中引用视图
- 不能在视图上创建索引
- 如果视图引用的表被删除,则当使用该视图时则将返回错误;如果创建具有相同表的结构俩答题已删除的表,则视图可以继续使用,否则必须重新创建视图
- 如果视图中的某一列是函数、数学表达式、常量、或来自多个表的列名相同,则必须给列定义名字。
- 当通过视图查询数据时,MySQL不仅要检查视图引用的表是否存在,是否有效,而且要验证对数据的修改是否违反了数据的完整性约束。如果失败将返回错误信息;若正确,则把对视图的查询转换为对引用表的查询。
- 使用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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
以上是关于MySQL-视图和索引的主要内容,如果未能解决你的问题,请参考以下文章