MySQL存储引擎

基本概念

所谓安装数据库服务器,只是在机器上安装了一个数据库管理系统程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。 为保存应用中实体的数据,一般会在数据库中创建多个表,以保存程序中实体的数据。 数据库服务器、数据库和表的关系如下:

mark

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品,只是存储引擎不同!

Mysql使用

连接Mysql服务

1mysql -h 127.0.0.1 -P 3306 -u root -p

-h 选项默认是127.0.0.1 -P默认是3306 后面有没有空格都是可以的 很多时候我们要使用本地Mysql服务的话,直接简写为:

1mysql -uroot -p

使用services.msc命令可以打开服务管理,来启动和关闭Mysql服务 《MySql服务器的启动和关闭》 这篇文章就讲述了如何通过命令其启动和关闭Mysql

SQL分类

DDL数据定义语言,用来维护存储数据的结构 代表指令: createdropalter

DML数据操纵语言,用来对数据进行行操作 代表指令: insertdeleteupdate

DML中又单独分了一个DQL,数据查询语言,代表指令: select

DCL数据控制语言,主要负责权限管理理和事务 代表指令: grantrevokecommit

MySQL架构

MySQL 是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如 Unix/Linux、Windows、Mac 和 Solaris。各种系统在底层实现⽅方⾯面各有不不同,但是 MySQL 基本上能保证在各个平台上的物理体系结构的一致性:

mark

说说这张图:

  • Client Connectors 是客户端链接,这个不用细说,就是应用程序与Mysql交互的接口,毕竟Mysql是要为程序提供数据存储服务的,所以必须将操作接口暴露出来,假如你是一个Java开发者,那么JDBC可以轻松链接上Mysql服务,就可以让你的Java程序使用上Mysql提供的服务
  • Connection Pool这个是连接池,Mysql与外界可能不止有一个连接,多次链接和断开会造成非常大的性能消耗,于是用使用连接池来管理这些链接,这就如Java的线程池来管理线程一样,通过连接池来避免性能损耗
  • Management Serveices & Utilities是管理服务和工具组件,例如备份恢复、Mysql复制、安全性验证、集群、分区工作台等,下面会演示一个Mysql备份的例子
  • SQL Interface 就是SQL接口,存储过程、触发器、视图等,接受用户的SQL命令,并且返回用户需要查询的结果。接收DML(data manipulation language)数据操纵语言、DDL(data definition language数据库定义语言、比如select from就是调用SQL Interface
  • Parser 是解析器,SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本,将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的,如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
  • Optimizer 是查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化,这个不难理解,假如你有一张info 表中的字段是年龄(很显然这个额字段值是大于0的),如果你在查询的时候的SQL语句是select * form info where age=-10,那么这条语句经过优化器之后不会再被执行,这就好像优化器知道不可能存在年龄小于0的条目
  • Caches 是高速缓存, 查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。 通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。 这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
  • Pluggable Storage Engines 是存储引擎,图中的圆柱体都是存储引擎,Mysql默认的存储引擎是InnoDB,后面谈论存储引擎
  • FileSystem 就是文件系统,Mysql数据库的数据最终还是要存放到文件中,所以我们可以理解为数据库就是一种帮我们管理数据的软件,处于文件系统的应用程序之间专门提供数据管理的软件,把数据的增删改查以及他的功能做了完美的封装,使用起来安全性更高,更方便我们队数据进行操作

Mysql存储引擎

存储引擎是:数据库管理理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。 MySQL的核心就是插件式存储引擎,支持多种存储引擎,所以你可以看到在Mysql的架构图上存储引擎的小插头,存储引擎是插拔式的,默认是InnoDB(从MySQL5.5.8开始,之前是MyISAM),当然也可以选择其他的存储引擎 使用show engines;命令可以查看支持的存储引擎:

mark 接下来说说他们的区别:

接下来说说他们的区别:

mark

MyISAM存储引擎

MyISAM是MySQL官方提供默认的存储引擎,其特点是不支持事务、表锁和全文索引,对于一些OLAP系统(OLAP 系统强调数据分析,强调SQL执行市场,强调磁盘I/O,强调分区等),操作速度快。关于 《OLAP、OLTP的介绍和比较》

每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是.frm(存储表定义)、.MYD (MYData,存储数据)、.MYI (MYIndex,存储索引)。这里特别要注意的是MyISAM不缓存数据文件,只缓存索引文件。

InnoDB存储引擎

InnoDB存储引擎支持事务,主要面向OLTP方面的应用,其特点是行锁设置、支持外键,并支持类似于Oracle的非锁定读,即默认情况下读不产生锁。InnoDB将数据放在一个逻辑表空间中。InnoDB通过多版本并发控制来获得高并发性,实现了ANSI标准的4种隔离级别,默认为Repeatable,使用一种被称为next-key locking的策略避免幻读。

对于表中数据的存储,InnoDB采用类似Oracle索引组织表Clustered的方式进行存储。

InnoDB 存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比Myisam的存储引擎,InnoDB 写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引

NDB存储引擎

NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC,但它是Share Nothing的架构,因此能提供更高级别的高可用性和可扩展性。NDB的特点是数据全部放在内存中,因此通过主键查找非常快。

关于NDB,有一个问题需要注意,它的连接(join)操作是在MySQL数据库层完成,不是在存储引擎层完成,这意味着,复杂的join操作需要巨大的网络开销,查询速度会很慢。

Memory (Heap) 存储引擎

Memory存储引擎(之前称为Heap)将表中数据存放在内存中,如果数据库重启或崩溃,数据丢失,因此它非常适合存储临时数据。

Archive存储引擎

正如其名称所示,Archive非常适合存储归档数据,如日志信息。它只支持INSERT和SELECT操作,其设计的主要目的是提供高速的插入和压缩功能。

Federated存储引擎

Federated存储引擎不存放数据,它至少指向一台远程MySQL数据库服务器上的表,非常类似于Oracle的透明网关。

InnoDB与MyISAM应用场景

参考: 《InnoDB与MyISAM两者的区别》 MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。

InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能

存储引擎相关SQL

查看Mysql已提供存储引擎

1show engines;

查看Mysql默认存储引擎:

1show variables like 'storage_engine';

查看某个表的存储引擎:

1show create table 表名;

修改表的存储引擎:

1alter table 表名 engine=引擎