Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql索引与视图

MySQL索引与视图详解

作者:霍理迪

MySQL中的索引类似于书籍的目录,用于提高数据查询效率,视图是一种虚拟表,可以提高数据的安全性,并简化查询语句,索引可以提高查询效率,但会占用磁盘空间,视图可以保障数据的安全性,隐藏底层列名,并提供逻辑数据独立性,感兴趣的朋友跟随小编一起看看吧

在MySQL中,索引类似于书籍的目录,如果想要快速访问数据表中的特定信息,可以建立索引加快数据查询效率。

使用数据库时,不仅需要提高对数据的查询效率,也需要考虑数据的安全问题。在MySQL中可以创建一种叫作视图的虚拟表,让使用视图的用户只能访问被允许访问的结果集,从而提高数据的安全性。除了安全性,视图还具备简化查询语句和逻辑数据独立性等优点。

在数据库查询数据时,默认是对全表的数据进行扫描,在项目开发中,MySQL的一张表可能就有千万条数据,多张表组合甚至有上亿条数据。这样查询一条数据的效率实在是太低了,因此我们引入了索引,索引是数据库中为提高数据查询效率而常用的数据库对象,它好比新华字典的音序表,通过音序表可以快速地查找内容。索引在数据表中一列或多列的值与记录行之间按照一定的顺序建立关系,以提高对数据表中数据的查询速度。

索引按照实现语法的不同大致分为五种(可以放一起写,这里每个字段分开展示)

1、主键索引

主键索引是一种特殊的唯一性索引,用于根据主键自身的唯一性标识每一条记录。主键索引的字段不允许有NULL值。

CREATE TABLE dept_index(
id INT
PRIMARY KEY (INT)
);

2、唯一性索引

创建唯一性索引的字段允许有NULL值,但需要保证索引对应字段中的值是唯一的。

CREATE TABLE dept_index(
deptno INT
UNIQUE INDEX (deptno)-- INDEX和KEY可以互相替换
);

3、普通索引

普通索引是MySQL中的基本索引类型,使用KEY或INDEX定义,不需要添加任何限制条件

CREATE TABLE dept_index(
dname VARCHAR(50)
INDEX (dname));

4、全文索引

全文索引主要用于提高在数据量较大的字段中的查询效率。全文索引和SQL中给的LIKE模糊查询类似,不同的是LIKE模糊查询适用于在内容较少的文本中进行模糊匹配,全文检索更擅长在大量的文本中进行数据检索。全文索引只能创建在CHAR、VARCHAR或TEXT类型的字段上。

CREATE TABLE dept_index(
introduction VARCHAR(200)
FULLTEXT (introduction));

5、空间索引

空间索引只能创建在空间数据类型的字段上。空间数据类型存储的空间数据是指含有位置、大小、形状以及自身分布特征等多方面信息的数据。MySQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON

对于创建空间索引的字段,必须将其声明为NOT NULL

CREATE TABLE dept_index(
address GEOMETRY NOT NULL SRID 4326
SPATIAL INDEX (address)
);

上述都属于单列索引,还存在复合索引如下

CREATE TABLE index_multi(
id INT NOT NULL,
NAME VARCHAR(20) NOT NULL,
score FLOAT,
INDEX multi(id,NAME)
);

可以在创建表之后建立索引

CREATE UNIQUE INDEX unique_id ON dept_index02(id);

也可以通过修改表的形式添加索引

ALTER TABLE dept_index03 ADD UNIQUE INDEX index_id(id);-- index_id是起的索引名 

查看添加的索引

SHOW INDEX FROM dept_index;

删除索引(两种方式任选)

1、ALTER TABLE dept_index DROP INDEX introduction;-- 想多删就在introduction索引后面加

2、DROP INDEX dname ON dept_index;-- 删除数据表dept_index中名称为dname的索引

注意:虽然索引可以提高数据的查询效率,但它会占用一定的磁盘空间,并且在创建和维护索引时,其消耗的时间是随着数据量的增加而增加的。因此,使用索引时,应该综合考虑其优点和缺点

视图的作用及意义

在实际开发中,有时候为了保障数据的安全性和提高查询效率,希望创建一个只包含指定字段数据的虚拟表给用户使用,此时可以使用视图。视图在数据库中的作用类似于窗户,用户通过这个窗户只能看到指定的数据。视图本身不存储数据,它只是一个保存下来的 SELECT 语句,每次查询视图时,数据库会执行这个 SELECT 语句,从底层表中取出数据。

特点有下面三个

简化查询语句:比如日常开发需要经常使用一个比较复杂的语句进行查询,此时就可以将该查询语句定义为视图,从而避免大量重复且复杂的操作

安全性:可以从数据库指定字段给别人看,防止敏感信息泄露。还可以改视图列名,隐藏底层列名

逻辑数据独立性 :数据表增加字段不会影响基于该数据表查询出数据的视图(不改视图本身,视图就不会变)

1、基于单表创建视图

CREATE VIEW view_emp AS SELECT empno,ename,job,deptno FROM emp;

2、查看视图

SELECT * FROM view_emp;

指定视图中字段的名称,并创建

CREATE VIEW view_emp2(e_empno,e_ename,e_job,e_deptno) AS SELECT empno,ename,job,deptno FROM emp; 

3、基于多表创建视图

CREATE VIEW view_emp_dept
AS 
SELECT e.empno,e.ename,e.job,e.deptno,d.dname
FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno=d.deptno-- 红色部分和之前左外连接一样

4、查看视图的状态信息

SHOW TABLE STSTUS LIKE '视图名';-- Comment 值为VIEW说明是视图,为空则不是
SHOW TABLE STSTUS LIKE'view_emp';

SHOW TABLE STATUS LIKE 'dept';

5、查看视图的创建语句

SHOW CREATE VIEW view_emp;

6、DESCRIBE:查看视图结构,可缩写成DESC

DESC `view_emp_dept`;

7、修改视图

方法一  CREATE OR REPLACE VIEW 视图名 AS SELECT语句; 创建一个新的视图覆盖旧的视图

CREATE OR REPLACE   VIEW -- 如果删除OR REPLACE 就会报错建过视图了
view_emp_dept(e_empno,e_ename,e_job,e_deptno,e_mgr,d_dname)
AS 
SELECT e.empno,e.ename,e.job,e.deptno,e.mgr,d.dname FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno=d.deptno

方法二  ALTER VIEW <视图名> AS <SELECT 语句>;

ALTER VIEW view_emp_dept(e_empno,e_ename,e_job,e_deptno,e_mgr,e_sal,d_dname)
AS 
SELECT e.empno,e.ename,e.job,e.deptno,e.mgr,e.sal,d.dname FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno=d.deptno-- 这块select语句基本不动,改上面红的视图名

8、删除视图

DROP VIEW view_emp_dept;

9、修改数据
通过视图修改数据,最终修改的也是基本表中的数据

UPDATE view_dept SET v_dname='工程部' WHERE v_deptno=50;

10、 删除数据
通过视图删除数据,最终删除的也是基本表中的数据

DELETE FROM view_dept WHERE  v_deptno=6;

到此这篇关于MySQL索引与视图的文章就介绍到这了,更多相关mysql索引与视图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文