首页 > 数据库 >Mysql视图和索引

Mysql视图和索引

时间:2024-05-31 09:58:12浏览次数:23  
标签:INDEX Mysql 使用 视图 索引 MySQL VIEW

什么是视图(view)

      MySQL 中的视图(View)是一个虚拟的表,其内容由查询定义。视图并不在数据库中以存储的数据值形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

视图的优势

简化复杂性:通过视图,用户可以只看到他们感兴趣的数据或数据的简化版本。
安全性:通过视图,可以限制用户对基础数据的访问,只暴露他们需要的部分。
逻辑数据独立性:当基础表的结构改变时,可以通过修改视图来保持相同的外观,从而减少对应用程序的影响。

创建视图

使用 CREATE VIEW 语句创建视图。
CREATE VIEW view_name AS  
SELECT column1, column2, ...  
FROM table_name  
WHERE condition;

示例:

CREATE VIEW emp_view AS  
SELECT ename, sal
FROM emp
WHERE sal> 1000;

使用视图

一旦创建了视图,就可以像使用常规表一样使用它。

例如:
SELECT * FROM emp_view ;

修改视图

如果需要更改视图,可以使用 ALTER VIEW 语句。但是,通常更常见的做法是删除视图并重新创建它,因为 ALTER VIEW 的功能可能因数据库系统而异(有些可能不支持)。

删除视图

使用 DROP VIEW 语句删除视图:

DROP VIEW emp_view;


视图注意事项

(1)视图是基于 SQL 语句的结果集的,因此,非确定性函数(如 NOW() 或 RAND())在视图定义中可能会导致问题。
(2)在某些情况下,对视图进行更新(如 INSERT, UPDATE, 或 DELETE)可能不受支持或受到限制,具体取决于视图的定义和基础表的结构(一般情况如果视图涉及到多表就是无法支持DML的)。
(3)使用视图时,应注意其可能对性能的影响,特别是在处理大量数据时(处理大量数据是要先测试是否能保证性能)。

什么是索引(index)

概念:索引是帮助MySQL高效获取数据的数据结构,通常是有序的。它允许数据库系统通过特定的查找算法快速定位到表中的某一行或某一组行。
本质:索引是一种数据结构,其本质目的是提高查询效率。
类比:索引可以类比为字典的目录,通过目录可以快速找到字典中的某个词或短语。

索引的类型

MySQL支持多种类型的索引,每种索引都有其特定的用途和优势:

普通索引(INDEX):允许在定义索引的列中插入重复值和空值。
唯一索引(UNIQUE):索引列值必须唯一,可以为NULL。
主键索引(PRIMARY KEY):索引列值必须唯一,不能为NULL,一个表只能有一个主键索引。
全文索引(FULL TEXT):用于在文本字段中进行全文搜索。
空间索引(SPATIAL):用于地理空间数据类型。
哈希索引(HASH):基于哈希表的索引,目前仅MEMORY存储引擎支持。
B-树索引(B-TREE):大部分MySQL索引都是基于B-树的。

索引的用途

快速查找:通过索引,可以加快WHERE子句后的条件查询速度。
快速排序:通过索引,可以加速ORDER BY子句后的排序操作。
减少I/O操作:索引可以使得系统不必扫描整个表,从而减少I/O操作。

索引的创建方法

MySQL提供了多种方法来创建索引:

使用CREATE INDEX语句:可以明确指定索引的名称、类型以及所包含的列。
使用ALTER TABLE语句:在修改表结构的同时添加索引。
在建表时创建索引:在CREATE TABLE语句中直接定义索引。

常见用法举例:

-- 创建索引
CREATE INDEX cname_01 ON classes(cname) ;

-- 查看索引
SHOW INDEX FROM classes ;

-- 删除索引
DROP INDEX cname_01 ON classes ;

索引的注意事项

最左前缀原则:MySQL使用最左前缀来匹配索引,因此索引列的顺序很重要。
避免过度索引:虽然索引可以提高查询性能,但过多的索引会占用大量磁盘空间并降低写操作的性能。
选择性高的列:尽量选择选择性高的列(即列中不同值的比例较高)作为索引列。
索引列不参与计算:保持索引列的“干净”,避免在索引列上进行计算或函数操作。

 索引的维护

(1)定期检查和优化:使用如SHOW INDEX FROM table_name;等命令来查看索引的使用情况,

并使用如: OPTIMIZE TABLE  表名   命令来优化表的性能(重新利用未使用的空间,并整理数据文件的碎片)。

optimize table '表名'只对MyISAM, BDB和InnoDB引擎表起作用。

要注意的是:

1.在OPTIMIZE TABLE运行过程中,MySQL会锁定表。(请注意选择运行时间不要影响业务执行)

2.如果是InnoDB引擎时我们还可以用alter table table.name engine='innodb'来代替optimize做优化。

3.你delete数据时,mysql并不会回收已删除的数据所占据的存储空间,以及索引位。而是空在那里,而是等待新的数据来弥补这个空缺,这样就有一个缺位,如果一时半会没有数据来填补这个空缺,那这样就太浪费资源了。所以对于写比较频繁的表,要定期进行optimize,一个月一次,看实际情况而定了。

(2)删除无用索引:对于不再使用或效率低下的索引,应及时删除以释放空间并提高性能。
通过合理地使用和管理MySQL索引,可以显著提升数据库的性能和效率。

标签:INDEX,Mysql,使用,视图,索引,MySQL,VIEW
From: https://blog.csdn.net/shark1978/article/details/139340154

相关文章

  • 面经-Java,Linux,Mysql,网络
    状态码2xx:成功类3xx:重定向4xx:客户端错误5xx:服务器错误404:未找到网页400:请求语法错误500:服务器错误503:服务器停机200:成功post和get的区别get多用于获取服务端数据,post多用于向服务端推送数据。get的参数多拼接在url中,post的参数放在请求体中。故post的安全系数高......
  • 31.MySQL数据库【一】基础介绍
    【一】数据库初识1)存储数据的演变过程基于内存保存文件操作json模块搭建TCP的客户端和服务端,TCP服务端用作存储服务,TCP客户端用于上传和下载数据存储数据的位置就是数据库2)数据库本质就是一块基于网络通信保存数据的应用程序3)数据库的介绍1.关联性数据库(存......
  • 32.MySQL数据库【二】存储引擎与基本数据类型.
    【一】MySQL之存储引擎1)介绍针对不同的数据有不同的处理机制,存储引擎就是不同的处理机制2)MySQL主要的存储引擎1.innodb是MySQL5.5版本之后的默认存储引擎支持事务、外锁、外键2.myisam是MySQL5.5版本之前的默认存储引擎速度比innodb快,但数据安全性较弱3.memory......
  • 34.MySQL数据库【四】过滤条件
    过滤条件【一】语法select*/字段名from*/表名where*/字段名=字段值;--执行顺序from起手知道是那张表where根据过滤条件在表中过滤数据select再过滤出自己想要的数据【二】准备的数据#创建表createtablefilt_eg( idintnotnulluniqueauto_increment,......
  • 33.MySQL数据库【三】约束条件
    约束条件限制表中的数据,保证数据的准确性和可靠性而存在的限制规则【一】非空约束(notnull)限制指定字段不能为空#建表createtableeg( namevarchar(32)notnull, hobbyvarchar(32));#name字段不能为空【二】唯一性约束(unique)限制字段具有唯一性,不能重复,但能为......
  • 35.MySQL数据库【五】多表查询和子查询
    多表查询和子查询【一】概念子查询:将一条SQL语句的查询结果加括号当做另外一条SQL语句的查询结果链表查询:先将多张表拼接到一起,形成一张大表,让后基于单表查询获取数据1)创建数据#建表createtabledep( idintPRIMARYKEYAUTO_INCREMENT,namevarchar(20));......
  • MySQL Shell 调用外部脚本
    使用CLI工具时,打错命令很容易纠正。不过,在MySQlShell中工作时,命令可能会更长、更复杂。以下是运行MySQLDocumentStore的一个例子。db.scores.find("year(date)=2023").fields(['lastName','firstName','round(avg(score),2)asavg','count(score)asnum......
  • 只更新装饰视图
    我计划在我的集合视图的某个位置添加一个视图。因此,我想使用装饰视图。现在,该位置应每分钟更改一次。如何在iOS7和iOS8上使用UICollectionView实现这一目标?似乎可以通过invalidateLayoutWithContext来实现这一目标,但是是否可以在一个布局中使用多个UICollectionView......
  • 【docker】docker 下 MySQL偶然无法访问
    1.概述我有一个环境遇到了docker下MySQL偶然无法访问,具体情况如下可以被看到可以telnet通畅,这个jar是我自己研发的,主要这台机器是别人的没有装telnet但是任务还是报错所在机器telnet通但是无法登录,同事说遇到过比如网络卡或者不稳定,需要重启一下mysql我先去......
  • MySQL 数据库中简单的创表语句以及增删改查语句
    假设我们有一个学生表students,包含以下列:id(学生编号)、name(学生姓名)、age(学生年龄),以下是创建这个表的SQL语句:CREATETABLEstudents(  idINTPRIMARYKEY,  nameVARCHAR(50),  ageINT);在这个创建语句中:•CREATETABLE:用于创建新表。•students:表......