前面的文章已经介绍了MySQL的索引与事务以及MySQL的备份与恢复的相关的内容,本文将对MySQL视图及存储过程以及存储引擎进行讲述。mysql
咱们在使用SQL语句进行多表查询的时候的命令是很是冗长而麻烦的,若是说这样的操做还很是多的使用的状况下就会加大工做人员的工做量,毕竟不能保证如此长的代码不会写错,而且屡次进行如此复杂的查询也会形成服务器资源占用比变大的问题,那么咱们有什么好的办法解决这样的问题呢?算法
其实,咱们能够将这些须要常常查询的数据内容(可能存在于多个表中)进行汇总到一个虚拟的表中,既方便了工做人员查询,也减轻了服务器的负担,而且在节约磁盘空间的同时也能够支持数据的动态变化,而这样的表就是“视图”。sql
其实视图是一种逻辑表,自己并不存放数据。而是做为一个select语句保存咋数据字典(能够理解为一个容器)中。经过视图,能够展示基表的备份数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。shell
基表:用来建立视图的表base table数据库
视图所占资源较少,就比如是水中月,实际并不存在,可是会根据基表的变化而产生变化。缓存
优势:安全
1)简单:使用视图的用户彻底不须要关心后面对应的表的结构、关联条件和筛选条件,对用户来讲已是过滤好的复合条件的结果集。服务器
2)安全:使用视图的用户只能访问他们被容许查询的结果集,对表的权限管理并不能限制到某个行某个列,可是经过视图就能够简单的实现。架构
3)数据独立:一旦视图的结构肯定了,能够屏蔽表结构变化对用户的影响,源表增长列对视图没有影响;源表修改列名,则能够经过修改视图来解决,不会形成对访问者的影响。并发
总而言之,使用视图的大部分状况是为了保障数据安全性,提升查询效率。
缺点:
1)性能差:数据库必须把视图查询转化成对基本表的查询,若是这个视图是由一个复杂的多表查询所定义,那么,即便是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,须要花费必定的时间。
2)修改限制:当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来讲,这是很方便的,可是,对于比较复杂的试图,多是不可修改的。
对于视图的算法,简单介绍一下,咱们须要在建立视图的时候指定,基本语法:
create + [algorithm = temptable/merge/undefined] + view + 视图名 + as + select语句 with check option;
视图算法,即系统对视图以及外部查询视图的select语句的一种解析方式。视图算法有三种,分别为:
建立通常视图命令格式:
create view 视图名称 as select +内容
简单的说,就是一组SQL语句集,功能强大,能够实现一些比较复杂的逻辑功能,相似于JAVA语言中的方法;
备注:存储过程跟触发器有点相似,都是一组SQL集,可是存储过程是主动调用的,且功能比触发器更增强大,触发器是某件事触发后自动调用;
有输入输出参数,能够声明变量,有if/else, case,while等控制语句,经过编写存储过程,能够实现复杂的逻辑功能;
函数的广泛特性:模块化,封装,代码复用;
速度快,只有首次执行需通过编译和优化步骤,后续被调用能够直接执行,省去以上步骤;
MySQL中的数据用各类不一样的技术存储在文件或者内存中。而这些技术中的每一种技术都使用不一样的存储机制、索引技巧、锁定水平并最终提供普遍的不一样的功能和能力。
这些不一样的技术以及与之相应的相关功能在MySQL中被称做为“存储引擎”。MySQL提供了多个不一样的存储引擎,能够预先设置或者在MySQL服务器中启用。
以上主要由6部分组成,主要有各类组件以及存储引擎和文件系统。咱们作简单的介绍
Connectors:链接组件,须要有驱动支持;主要用于使用不一样的语言代码程序和MySQL的交互
Connection Pool:链接池组件;主要是管理、缓冲用户的链接,线程处理等须要缓存的需求
Management Service & Utilities:管理服务与工具组件;例如进行备份恢复、MySQL复制、集群等;
SQL Interface:SQL接口;主要接受用户的SQL命令语句,而且返回用户须要查询的结果;
Parser:查询解析器;当SQL命令语句传递到解析器的时候会被解析器验证和解析(权限、语法结构);
Optimizer:查询优化器;SQL语句在执行以前使用查询优化器对查询进行优化;举个例子:
select id,name from where hobby = ‘read’;
1)这个select语句查询会先根据where语句进行选取;
2)其次根据id和name进行属性投影;
3)结合两个查询条件输出最终的查询结果
Caches & Buffers:缓存;当查询缓存中有命中的查询结果,查询语句就能够直接去查询缓存中取数据;
Plugggable Storage Engines:插入式存储引擎;是为了管理操做数据(存储、更新、查询数据的方法方式)
MyISAM存储引擎是MySQL数据库系统5.5版本以前的默认存储引擎。考虑到的问题是:查询的次数远远大于更新的次数,所以须要执行读取操做数据速度比较快,而且不须要占用大量的内存和存储资源。
MyISAM管理非事务表,提供索引和字段管理,且拥有表格锁定机制从而优化多个并发的读写操做。
不支持事务;
表格锁定机制,数据在更新时锁定整个表;
数据库在读写过程当中互相阻塞;
能够经过key_buffer_size来设置缓存索引,提升访问性能,减小磁盘IO读写压力
速度快且占用资源少;
不支持外键约束,只支持全文索引;
存储文件为
1).frm 文件存储表定义;
2).MYD 数据文件扩展名
3).MYI 索引文件扩展名
InnoDB存储引擎是MySQL数据库系统535版本以后的默认存储引擎,是为了解决或者优化MyISAM存储引擎不足之处而产生的。
能够这么说,InnoDB存储引擎是为处理巨大数据量时的最大性能而设计的。
根据需求选择适合的存储引擎,而后考虑如何修改;
(1)查看数据库能够配置的存储引擎类型;
(2)查看表正在使用的存储引擎类型;
(3)配置存储引擎为所选择的类型
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 9 rows in set (0.00 sec)
Engine列表示当前版本的MySQL所支持的引擎类型;
Support列表示对应引擎是否可使用,DEFAULT表示默认使用的类型此版本(MySQL5.7.17)是InnoDB;
Transactions列表示对应引擎是否支持事务;
mysql> show table status from student where name = 'info'; +------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+ | info | InnoDB | 10 | Dynamic | 4 | 4096 | 16384 | 0 | 0 | 0 | 5 | 2020-01-08 19:47:38 | NULL | NULL | utf8_general_ci | NULL | | | +------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+ 1 row in set (0.01 sec)
或者使用create命令也能够查看表的存储引擎
mysql> show create table info; +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | info | CREATE TABLE "info" ( "id" int(3) NOT NULL AUTO_INCREMENT, "name" varchar(6) DEFAULT NULL, "score" decimal(5,2) DEFAULT NULL, PRIMARY KEY ("id") ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.01 sec)
使用alter命令:alter table 表名 engine= 引擎名称
mysql> alter table info engine=Myisam; Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> show create table info; +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | info | CREATE TABLE "info" ( "id" int(3) NOT NULL AUTO_INCREMENT, "name" varchar(6) DEFAULT NULL, "score" decimal(5,2) DEFAULT NULL, PRIMARY KEY ("id") ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
或者在手工编译安装时在MySQL主配置文件/etc/my.cnf的mysqld下添加:default-storage-engine=引擎名称,以后重启服务便可。
另外能够在建立表的时候就指定存储类型:create table test (id int) engine=MyISAM;
本文介绍了MySQL数据库的视图以及简述了存储过程,其中咱们须要掌握MySQL数据库系统的体系架构;其次咱们介绍了MySQL的两个存储引擎MyISAM和InnoDB,而且介绍各自的特色以及相应的使用场景;最后实例演示了如何配置存储引擎的过程。