MySQL视图、存储过程与存储引擎

MySQL视图、存储过程与存储引擎

一、前言

? 前面的文章已经介绍了MySQL的索引与事务以及MySQL的备份与恢复的相关的内容,本文将对MySQL视图及存储过程以及存储引擎进行讲述。

二、MySQL视图

2.1问题引出——视图的概念

? 我们在使用SQL语句进行多表查询的时候的命令是非常冗长而麻烦的,如果说这样的操作还非常多的使用的情况下就会加大工作人员的工作量,毕竟不能保证如此长的代码不会写错,并且多次进行如此复杂的查询也会造成服务器资源占用比变大的问题,那么我们有什么好的办法解决这样的问题呢?

? 其实,我们可以将这些需要经常查询的数据内容(可能存在于多个表中)进行汇总到一个虚拟的表中,既方便了工作人员查询,也减轻了服务器的负担,并且在节约磁盘空间的同时也可以支持数据的动态变化,而这样的表就是“视图”。

? 其实视图是一种逻辑表,本身并不存放数据。而是作为一个select语句保存咋数据字典(可以理解为一个容器)中。通过视图,可以展现基表的备份数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。

基表:用来创建视图的表base table

?

2.2为什么要使用视图——视图的特点及优缺点

视图所占资源较少,就好比是水中月,实际并不存在,但是会根据基表的变化而产生变化。

优点:

? 1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。

? 2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。

? 3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

? 总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。

缺点:

? 1)性能差:数据库必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间。

? 2)修改限制:当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。

2.3简述视图算法

? 对于视图的算法,简单介绍一下,我们需要在创建视图的时候指定,基本语法:
create + [algorithm = temptable/merge/undefined] + view + 视图名 + as + select语句 with check option;
视图算法,即系统对视图以及外部查询视图的select语句的一种解析方式。视图算法有三种,分别为:

  • undefined:未定义(默认的),这不是一种实际使用的算法,而是一个“推卸责任”的算法。在未定义的情况下,告诉系统,视图没有定义算法,请自己选择。
  • temptable:临时表算法,系统先执行视图的select语句,后执行外部查询语句。
  • merge:合并算法,系统先将视图对应的select语句与外部查询视图的select语句进行合并,然后再执行。此算法比较高效,且在未定义算法的时候,经常会默认选择此算法。

2.4创建视图命令

创建一般视图命令格式:

create view 视图名称 as select +内容

三、MySQL存储过程(偏向软件开发方向)

3.1何为存储过程?

? 简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;

? 备注:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用;

3.2存储过程特点

? 有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;

? 函数的普遍特性:模块化,封装,代码复用;
? 速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;

四、MySQL存储引擎

4.1存储引擎介绍

? MySQL中的数据用各种不同的技术存储在文件或者内存中。而这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供广泛的不同的功能和能力。

? 这些不同的技术以及与之相应的相关功能在MySQL中被称作为“存储引擎”。MySQL提供了多个不同的存储引擎,可以预先设置或者在MySQL服务器中启用。

4.2MySQL的体系架构

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:插入式存储引擎;是为了管理操作数据(存储、更新、查询数据的方法方式)

4.3MyISAM存储引擎

4.3.1MyISAM的介绍

? MyISAM存储引擎是MySQL数据库系统5.5版本之前的默认存储引擎。考虑到的问题是:查询的次数远远大于更新的次数,因此需要执行读取操作数据速度比较快,并且不需要占用大量的内存和存储资源。

? MyISAM管理非事务表,提供索引和字段管理,且拥有表格锁定机制从而优化多个并发的读写操作。

4.3.2MyISAM的特点

  1. 不支持事务;

  2. 表格锁定机制,数据在更新时锁定整个表;

  3. 数据库在读写过程中互相阻塞;

  4. 可以通过key_buffer_size来设置缓存索引,提高访问性能,减少磁盘IO读写压力

  5. 速度快且占用资源少;

  6. 不支持外键约束,只支持全文索引;

  7. 存储文件为

    1).frm 文件存储表定义;

    2).MYD 数据文件扩展名

    3).MYI 索引文件扩展名

4.3.2MyISAM的适用场景

  1. 业务无需支持事务;
  2. 单方面读取较多的业务,或单方面写数据的业务;
  3. 并发访问少的业务;
  4. 数据修改较少的业务;
  5. 服务器硬件资源较低

4.4InnoDB存储引擎

4.4.1InnoDB的介绍

? InnoDB存储引擎是MySQL数据库系统535版本之后的默认存储引擎,是为了解决或者优化MyISAM存储引擎不足之处而产生的。

? 可以这么说,InnoDB存储引擎是为处理巨大数据量时的最大性能而设计的。

4.4.2InnoDB的特点

  1. 支持事务,支持4个事务隔离级别;
  2. 行级锁定,除了全表扫描是表级锁定;
  3. 读写阻塞与事务隔离级别相关;
  4. 缓存高效,既能缓存索引也能缓存数据;
  5. 表与主键以簇的方式存储;
  6. 支持分区、表空间;
  7. 支持外键约束;

4.4.3InnoDB的适用场景

  1. 业务需要事务的支持;
  2. 并发量高的业务;
  3. 业务数据更新频繁;微博等
  4. 业务数据一致性要求较高:银行业务
  5. 硬件资源较高

五、如何配置合适的存储引擎?

5.1配置修改存储引擎的步骤

根据需求选择适合的存储引擎,然后考虑如何修改;

(1)查看数据库可以配置的存储引擎类型;

(2)查看表正在使用的存储引擎类型;

(3)配置存储引擎为所选择的类型

5.2具体的操作步骤

5.2.1查看数据库可以配置的存储引擎类型;

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列表示对应引擎是否支持事务;

5.2.2查看表正在使用的存储引擎类型;

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)

5.2.3配置存储引擎为所选择的类型

使用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,并且介绍各自的特点以及相应的使用场景;最后实例演示了如何配置存储引擎的过程。