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的体系架构

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

原文地址:https://blog.51cto.com/14557673/2465408

时间: 2024-10-05 16:08:56

MySQL视图、存储过程与存储引擎的相关文章

MySQL中常用的存储引擎(MyISAM 和InnoDB)

 数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用存储引擎进行创建.查询.更新和删除数据操作.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能.现在许多的数据库管理系统都支持多种不同的存储引擎.MySQL的核心就是存储引擎. 使用 SHOW ENGINES; 命令查看MySQL支持的存储引擎,  Support 列表示某种引擎是否可以使用,YES表示可以,NO表示不可以,DEFAULT表示当前默认存储引擎. mysql> SH

MySQL技术内幕-InnoDB存储引擎-读书笔记(二)

MySQL技术内幕-InnoDB存储引擎-读书笔记(二) 作为php开发,使用mysql总是少不了的 系列文章博客链接 http://itsong.net/articles/466.html 第三章 文件 mysql与innodb几个类型的文件 参数文件,配置路径.初始化参数.内存大小等 日志文件,包括错误日志,二进制日志,慢查询日志,查询日志 socket文件,用unix域套接字,unix domain socket来进行连接时需要的文件,这一般是本机连接,比通常tcp快 pid文件,进程id

Mysql技术内幕——InnoDB存储引擎

一.mysql体系结构和存储引擎 1.1.数据库和实例的区别 数据库:物理操作系统或其他形式文件类型的集合.在mysql下数据库文件可以是frm,myd,myi,ibd结尾的文件. 数据库实例:由数据库后台进程/线程以及一个共享内存区组成.数据库实例才是真正用来操作数据库文件的. mysql数据库是单进程多线程的程序,与sql server比较类似.也就是说,Mysql数据库实例在系统上的表现就是一个进程. 1.2.mysql的体系结构 mysql由连接池组件.管理服务和工具组件.sql接口组建

《mysql技术内幕 InnoDB存储引擎(第二版)》阅读笔记

一.mysql架构 mysql是一个单进程多线程架构的数据库. 二.存储引擎 InnoDB: 支持事务 行锁 读操作无锁 4种隔离级别,默认为repeatable 自适应hash索引 每张表的存储都是按主键的顺序记性存放 支持全文索引(InnoDB1.2.x - mysql5.6) 支持MVCC(多版本并发控制)实现高并发 MyISAM: 不支持事务 表锁 支持全文索引 三.InnoDB体系架构 1.后台线程 Master Thread 负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性 IO

MySQL技术内幕-InnoDB存储引擎-读书笔记(一)

MySQL技术内幕-InnoDB存储引擎-读书笔记(一) 作为php开发,使用mysql总是少不了的 博客链接 http://itsong.net/articles/466.html 第一章 MySQL体系结构和存储引擎 MySQL被设计为一个单进程多线程架构的数据库 ./mysql --help | grep my.cnf 可以查看mysql数据库实例启动时,它会在哪些位置查找配置文件. 配置文件中有一个datadir参数,指定了数据库所在的路径.默认为/usr/local/mysql/dat

MYSQL 浅谈MyISAM 存储引擎

思维导图 介绍 mysql中用的最多存储引擎就是innodb和myisam.做为Mysql的默认存储引擎,myisam值得我们学习一下,以下是我对<高性能MYSQL>书中提到的myisam的理解,请大家多多指教. 特点 > 不支持事务 证明如下: >> 表记录:t2表的engine是myisam. >> 操作 注意:如果你在数据库进行事务操作,但是事务无法成功,你就要看你的表引擎了,看这种引擎是否支持事务. >> 下面请看innodb中的事务操作 &g

mysql技术内幕InnoDB存储引擎-阅读笔记

mysql技术内幕InnoDB存储引擎这本书断断续续看了近10天左右,应该说作者有比较丰富的开发水平,在源码级别上分析的比较透彻.如果结合高可用mysql和高性能mysql来看或许效果会更好,可惜书太厚,还在啃当中,希望能早点读完……. 应该说与oracle相比,mysql数据库还是相对比简单,以后还是深入学习下oracle去. 搞数据库也比搞应用运维相对单纯,不用知道各种应用架构,不用写各种脚本工具,只要掌握这个软件就足够了.当然希望自己的知识还是全面一些好.

mysql 选择合适的存储引擎

1 MyISAM:默认的MySQL 插件式存储引擎.如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性.并发性要求不是很高,那么选择这个存储引擎是非常适合的.MyISAM 是在Web.数据仓储和其他应用环境下最常使用的存储引擎之一.2 InnoDB:用于事务处理应用程序,支持外键.如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多的更新.删除操作,那么InnoDB 存储引擎应该是比较合适的选择.InnoDB 存储

mysql InnoDB 和 Myisam 存储引擎的区别

1. InnoDB 支持事物,Myisam 不支持事物 2. InnoDB 是行级锁,Myisam 表级锁 3. InnoDB 不支持全文索引,Myisam 支持全文索引,但不支持外键 4. InnoDB 在磁盘上是两个文件,Myisam 是三个文件 5 myISAM管理非事务表.它提供高速存储和检索,以及全文搜索能力.如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择 6InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持.如果应用中需要执行大量的INSER