什么是视图(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索引,可以显著提升数据库的性能和效率。