第8节-MySQL索引与视图
8.1、索引
8.1.1、索引优缺点
索引的优点:
1、可以提高查询数据的速度;
2、通过创建唯一索引,可以保证数据库表中每一行数据的唯一性;
3、在实现数据的参考完整性方面,可以加速表和表之间的连接;
4、在使用分组和排序子句进行数据查询时,可以减少分组和排序的时间;
索引的缺点:
1、创建和维护索引需要耗费时间,并且随着数据量的增加所耗费的时间也会增加;
2、索引需要占用磁盘空间,如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸;
3、当对表中的数据进行增加﹑删除和修改操作时,索引也需要动态的维护,这样就降低了数据的维护速度;
8.1.2、索引引擎与类型
1、索引是在存储引擎中实现的,每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。
2、依据MySQL中不同索引的存储类型
BTREE
HASH
3、MyISAM和InnoDB存储引擎只支持BTREE索引, BTREE索引也是MySQL中最常用的索引结构
4、MEMORY/HEAP存储引擎可以支持HASH和 BTREE索引。
8.1.3、索引分类
1、普通索引:是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值。
2、唯一索引:索引列的值必须唯一,但允许有空值·如果是复合索引,则列值的组合必须唯一·主键索引是一种特殊的唯一索引,不允许有空值。
3、复合索引(又称组合索引或多列索引):复合索引是在数据表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。
4、全文索引:全文索引是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。
5、空间索引:空间索引是对空间数据类型的字段建立的索引。
8.1.4、索引的建立原则
高效的索引有利于快速查找数据,而设计不合理的索引可能会对数据库和应用程序的性能造成障碍。因此,创建索引时应尽量考虑符合以下原则,便于提升索引的使用效率。
1、不要建立过多的索引
2、为用于搜索﹑排序或分组的列创建索引,而对于用作输出显示的列则不宜创建索引。
3、使用唯一索引,并考虑数据列的基数О数据列的基数是指它所容纳的所有非重复值的个数。
4、使用短索引,应尽量选用长度较短的数据类型。
5、选用字符串为索引时,应尽可能指定前缀长度。
8.1.5、索引管理
8.1.5.1、索引关键字
索引关键字: unique:唯一索引 fulltext:全文索引 spatial:空间索引 index和key:索引关键字,二选一即可。
8.1.5.2、创建表语句时,使用索引
-- 创建表的时候,创建索引 create table goods( id varchar(20), code varchar(10), name varchar(32), unique index ix_code(code(10)) );
8.1.5.3、创表完成后,再增加索引
-- 创表完成后,再增加索引 create table goods( id varchar(20), code varchar(10), name varchar(32) ); -- 单一索引 alter table goods add unique ix_id(id); -- 复合索引 alter table goods add unique ix_id_code(id,code); -- 或者使用这种方法创建也可以 create unique index ix_id_code on goods(id,code);
8.1.5.4、查询索引
-- 查询索引 show create table goods; desc goods; show index from goods; show keys from goods;
8.1.5.5、删除索引
-- 删除索引 alter table goods drop index ix_id_code; drop index ix_id_code on goods;
8.1.5.6、修改索引
-- 修改索引 在MySQL中并没有提供修改索引的直接指令,一般情况下,需要先删除掉原索引,再根据需要创建一个同名的索引 ,从而变相地实现修改索引操作。
8.2、视图
8.2.1、视图场景
视图是从一个或多个数据表中导出的虚拟表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。
这样,用户不用看到整个数据表中的数据,而只关心对自己有用的数据·视图可以使用户的操作更方便,并且可以保障数据库系统的安全性。
8.2.2、视图的概念
1、视图是一个虚拟的表,是从数据库中一个或多个表中导出来的表,其内容由查询语句定义。
2、同真实的数据表一样,视图由行和列组成
3、数据库中只存放了视图的定义,而并没有存放视图中的数据,这些数据均存放在原来的数据表中
4、使用视图查询数据时,数据库系统会从原来的表中取出对应的数据·图中的数据是依赖原始数据表中的数据,一旦表中的数据发生改变,显示在视图中的数据也会发生改变。
5、在定义了一个视图之后,就可以把它当作表来引用。
6、视图永远依赖原数据表
8.3.3、视图特征
对于所引用的原始表来说,视图的作用类似于筛选。定义视图可以来自当前或其他数据库的一个或多个表,或者其他视图。
1、简单性
视图可以大大简化用户对数据的操作。可以将经常使用的连接﹑投影﹑联合查询或选择查询定义为视图,这样在每次执行相同的查询时,不必重新写这些复杂的查询语句,只要一条简单的查询视图语句即可
2、安全性
视图可以作为一种安全机制·通过视图用户只能查看和修改他们所能看到的数据,其他数据既不可见也不可访问。
3、逻辑数据独立性
视图可以使应用程序和数据库表在一定程度上独立·程序可以建立在视图之上,从而程序与数据库被视图分割开来
8.3.4、视图管理
8.3.4.1、创建视图
-- 创建视图 create view v_student as select * from student where sdept='020-电子信息工程系';
8.3.4.2、调用视图
-- 调用视图 select * from v_student;
8.3.4.3、查询视图
-- 查询视图 show table status like 'v_stu%'\G; desc v_student; show create view v_student;
8.3.4.4、修改视图
-- 修改视图 create or replace view v_student as select * from student where sdept='软件技术'; alter view v_student as select * from student where sdept='软件技术';
8.3.4.5、删除视图
-- 删除视图 drop view v_student; drop view if exists v_student;
8.3.4.6、更新视图数据
-- 更新视图数据 update v_student set birthdate='2000-01-01' where name='xxxx'
8.3.4.7、插入视图数据
-- 插入视图数据 insert into v_student values('95009','name','sex','1999-01-01 00:00:00')
8.3.4.8、删除视图数据
-- 删除视图数据 delete from v_student where name='cccc';
8.3.4.9、查询整个库的视图
-- 查询整个库的视图 show table status where comment='VIEW';