MySQL:存储引擎介绍

前言,什么是存储引擎

mysql中建立的库===>文件夹

库中建立的表===>文件

  现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等

  数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。

  存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)

  在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql
数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎

  SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL 的插件式存储引擎可以让存储引擎层的开发人员设 计他们希望的存储层,例如,有的应用需要满足事务的要求,有的应用则不需要对事务有这 么强的要求 ;有的希望数据能持久存储,有的只希望放在内存中,临时并快速地提供对数据 的查询。

一,MySQL存储引擎

  存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。MySQL5.5以后默认使用InnoDB存储引擎。

  下图是MySQL中各种存储引擎的对比。

1.MyISAM:

  这种引擎是mysql最早提供的。它不支持事务,也不支持外键,尤其是访问速度快。这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM三种:

  1) 静态MyISAM:如果数据表中的各数据列的长度都是预先固定好的,服务器将自动选择这种表类型。因为数据表中每一条记录所占用的空间都是一样的,所以这种表存取和更新的效率非常高。 当数据受损时,恢复工作也比较容易做。这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。

   2) 动态MyISAM:如果数据表中出现varchar、xxxtext或xxxBLOB字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小,但由于每条记录的长度不一,所以 多次修改数据后,数据表中的数据就可能离散的存储在内存中,进而导致执行效率下降。同时,内存中也可能会出现很多碎片。因此,这种类型的表要经常用optimize table命令或者myisamchk -r命令 或 优化工具来整理碎片、改善性能,并且出现故障的时候恢复相对比较困难。

  3) 压缩MyISAM:以上说到的两种类型的表都可以用myisamchk工具压缩。这种类型的表进一步减小了占用的存储,但是这种表压缩之后不能再被修改。另外,因为是压缩数据,所以这种表在读取的时候要先时行解压缩。但是,不管是何种MyISAM表,目前它都不支持事务,行级锁和外键约束的功能。

2.Merge:

  这种类型是MyISAM类型的一种变种。合并表是将几个相同的MyISAM表合并为一个虚表。常应用于日志和数据仓库。

3.InnoDB:

  InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。对比MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多 的磁盘空间以保留数据和索引。

4.memory:

  这种类型的数据表只存在于内存中。它使用HASH索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中,但是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。默认情况下,memory数据表使用散列索引,利用这种索引进行“相等比较”非常快,但是对“范围比较”的速度就慢多了。因此,散列索引值适合使用在"="和"<=>"的操作符中,不适合使用在"<"或">"操作符中,也同样不适合用在order by字句里。如果确实要使用"<"或">"或betwen操作符,可以使用btree索引来加快速度。

  存储在MEMORY数据表里的数据行使用的是长度不变的格式,因此加快处理速度,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型。VARCHAR是一种长度可变的类型,但因为它在MySQL内部当作长度固定不变的CHAR类型,所以可以使用。

  使用USING HASH/BTREE来指定特定到索引:create index mem_hash using hash on tab_memory(city_id);

5.archive:

  这种类型只支持select 和 insert语句,而且不支持索引。常应用于日志记录和聚合分析方面。

6.BLACK HOLE:

  黑洞存储引擎,可以应用于主备复制中的分发主库。

7.NDB存储引擎:

  2003年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。

8.NEST存储引擎:

  网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。

  MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅 力所在。

二,存储引擎如何选择

是否支持事务

检索和添加速度

锁机制

缓存

是否支持全文索引

是否支持外键

三,MyISAM和InnoDB对比

四,什么时候使用MyISAM和InnoDB

    MyISAM:读事务要求不高,以查询和插入为主,可以使用这个引擎来创建表,
例如各种统计表。

  InnoDB:对事务要求高,保存的是重要的数据
例如交易数据,支付数据等,对用户重要的数据,建议使用InnoDB。

五,对存储引擎的操作

1.查看数据库默认的存储引擎:

show engines;   

show variables like ‘default_storage_engine‘;

2.查看表的存储引擎:

  1) 显示表的创建语句:

show create table tablename;

2) 显示表的当前状态值:

show table status like ‘tablename’ \G

  

3) 设置或修改表的存储引擎

  • 创建数据库表时设置存储存储引擎的基本语法是:
create table tableName(
      columnName(列名1) type(数据类型) attri(属性设置),
      columnName(列名2) type(数据类型) attri(属性设置),
      ....) engine = engineName

  

  • 修改存储引擎,可以用命令
Alter table tableName engine = engineName

4)练习

创建四个表,分别使用innodb,myisam,memory,blackhole存储引擎,进行插入数据测试

MariaDB [db1]> create table t1(id int)engine=innodb;
MariaDB [db1]> create table t2(id int)engine=myisam;
MariaDB [db1]> create table t3(id int)engine=memory;
MariaDB [db1]> create table t4(id int)engine=blackhole;
MariaDB [db1]> quit
[[email protected] db1]# ls /var/lib/mysql/db1/ #发现后两种存储引擎只有表结构,无数据
db.opt  t1.frm  t1.ibd  t2.MYD  t2.MYI  t2.frm  t3.frm  t4.frm

#memory,在重启mysql或者重启机器后,表内数据清空
#blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录

  

五,配置和数据文件

1.配置文件默认位置

    Linux: /etc/my.cnf

    Windows: my.ini

2.数据文件位置

   1) 查看数据文件位置的命令: show variables like ‘%datadir%‘ ;

   2) 数据文件格式:

      InnoDB:frm(存储的表结构)、ibd(存储的数据和索引)

      MyISAM:frm(存储的表结构)、MYD(存储的数据)、MYI(存储的索引)

六,数据库表设计

1.第一范式

  1) 概念:列不可分。每一列都是不可分割的基本数据项。

  2) 例子:假设我们有一个学生表,字段包括:id,name,age,contact,如下:

    

     当我们需要根据QQ来查询学生的时候,就查询不出,所以以上的设计就不符合1NF。我们可以将contact字段拆分为phone和QQ,如下:

  

  这样就满足1NF了。

2.第二范式   

  1) 概念:1NF的基础上面,非主属性完全依赖于主关键字。

  2) 例子:学生表:(学号, 姓名, 年龄, 课程名称, 成绩, 学分) ,从字段可以看出,此表联合主键是(学号,课程名称)。

   存在如下决定关系:

    1:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)

    2:(课程名称) → (学分)

    3:(学号) → (姓名, 年龄)

  其中,姓名、年龄、学分是部分依赖于主键的,而成绩是完全依赖于主键的,存在部分依赖关系,所以不满足第二范式。

  这会造成如下问题:

    (1) 数据冗余:

      同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。

    (2) 更新异常:

      若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。

    (3) 插入异常:

      假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据 库。

    (4) 删除异常:

      假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。

  问题就在于存在非主属性对主键的部分依赖。

  解决办法:把原表(学号, 姓名, 年龄, 课程名称, 成绩, 学分)分成三个表:

       学生:Student(学号, 姓名, 年龄);

       课程:Course(课程名称, 学分);

        选课关系:SelectCourse(学号, 课程名称, 成绩)。

3.第三范式

  1) 概念:2NF的基础上,属性不依赖于其它非主属性 , 消除传递依赖。第三范式又可描述为:表中不存在可以确定其他非关键字的非关键字段。

  2) 例子:学生表:(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),主键必然是学号。

         由于主键是单一属性,所以非主属性完全依赖于主键,所以必然满足第二范式。但是存在如下传递依赖:

      (学号) → (所在学院) → (学院地点, 学院电话),

      学院地点 和 学院电话传递依赖于学号,而学院地点和学院电话都是非关键字段,即表中出现了“某一非关键字段可以确定出其它非关键字段”的情况,于是违反了第三范式。          

     解决办法:

    把原表分成两个表:

      学生:(学号, 姓名, 年龄, 所在学院);

      学院:(学院, 地点, 电话)。

原文地址:https://www.cnblogs.com/wj-1314/p/9152050.html

时间: 2024-11-14 12:47:50

MySQL:存储引擎介绍的相关文章

数据库 之 Mysql存储引擎介绍

1  存储引擎概念介绍 存储引擎其实就是如何实现存储数据,如何为存储的数据建立索引以及如何更新,查询数据等技术实现的方法.数据库中的存储引擎其实是对使用了该引擎的表进行某种设置,数据库中的表设定了什么存储引擎,那么该表在数据存储方式.数据更新方式.数据查询性能以及是否支持索引等方面就会有不同的"效果". 通过选择不同的存储引擎,获得额外的速度或者功能,从而改善服务器的应用的整体功能.例如,如果你在研究大量的临时数据,你也许需要使用内存MySQL存储引擎.内存存储引擎能够在内存中存储所有

mysql 存储引擎介绍

一  存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念,后面我们还会说,但是现在要确定这一点. 在讲清楚什么是存储引擎之前,我们先来个比喻,我们都知道录制一个视频文件,可以转换成不同的格式,例如mp4,avi,wmv等,而存在我们电脑的磁盘上也会存在于不同类型的文件系统中如windows里常见的ntfs.fat32,存在于linux里常见的ext3,ext4,xfs,但是,给我们或者用户看懂实际视频内容都是一样的.直观区别是,占用系统的

MySQL存储引擎介绍 w

一 存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念,后面我们还会说,但是现在要确定这一点. 在讲清楚什么是存储引擎之前,我们先来个比喻,我们都知道录制一个视频文件,可以转换成不同的格式,例如mp4,avi,wmv等,而存在我们电脑的磁盘上也会存在于不同类型的文件系统中如windows里常见的ntfs.fat32,存在于linux里常见的ext3,ext4,xfs,但是,给我们或者用户看懂实际视频内容都是一样的.直观区别是,占用系统的空

第三章 MySQL存储引擎介绍

1 MySQL存储引擎的概念 MySQL中数据用各种不同的技术存储在文件(或内存)中,这些技术都使用不同的存储机制.索引技巧,锁定水平,并且最终提供广泛的.不同的功能,通过选择不同的技术,能够获得额外的速度或功能,从而改善整体功能. SQLServer和Oracle都使用了一种存储引擎,而MySQL有多种存储引擎. 所谓的存储引擎,其实就是表的类型 2 查询MySQL中支持的存储引擎 show engines; show engines \g show variables like 'have%

MySQL存储引擎介绍

MySQL主要有两个层次组成:MySQL核心[MySQL服务器层].插件式存储引擎    MySQL处理机制无论在核心上如何被解析,最后如果真正实现跟文件系统上的文件交互时,一定要经过存储引擎来完成.真正把MySQL操作接收下来并提交给底层文件上对应的数据完成操作,并将结果返回给上层MySQL核心的是MySQL存储引擎,各存储引擎通过统一的API向MySQL服务器提供一个统一的数据存取.加锁等操作.        MySQL内部表状态信息查看,使用  show table status like

mysql 存储引擎 介绍

一.InnodDB InnoDB表是基于聚蔟索引建立的,默认级别是 REPEATABLE_READ(可重复读),支持热备份,mysql 的其它引擎不支持. 支持行级锁,用来处理大量的 短期事务.InnodDB的性能和自动崩溃恢复特性,但得它在非事务型存储的需求中中也很流行.除非有非常的特别的原因需要使用其它的存储引擎,否则应该优先考虑InnoDB引擎. 二.MyISAM MyISAM提供了大量的特性,包括全文索引.压缩.空间函数(GIS)等,但MyISAM不支持事务和行级锁而且有一个毫无疑问的缺

mysql 存储引擎介绍2

了解MYSQL的都知道,在MYSQL中建立任何一张数据表,在其数据目录对应的数据库目录下都有对应表的.frm文件,.frm文件是用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,.frm文件跟数据库存储引擎无关,也就是任何存储引擎的数据表都必须有.frm文件,命名方式为数据表名.frm,如user.frm. .frm文件可以用来在数据库崩溃时恢复表结构. MySQL文件包括MySQL所建数据库文件和MySQL所用引擎创建的数据库文件. .frm 文件与操作系统和数据库引擎无关,都有

mysql 存储引擎介绍1

1.1  存储引擎的使用 数据库中的各表均被(在创建表时)指定的存储引擎来处理. 服务器可用的引擎依赖于以下因素: MySQL的版本 服务器在开发时如何被配置 启动选项 为了解当前服务器中有哪些存储引擎可用,可使用SHOW ENGINES语句: mysql> SHOW ENGINES\G 在创建表时,可使用ENGINE选项为CREATE TABLE语句显式指定存储引擎. CREATE TABLE t (i INT) ENGINE = MyISAM; 如果在创建表时没有显式指定存储引擎,则该表使用

mysql存储引擎介绍,索引

区别: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能.两种类型最主要的差别就是Innodb  支持事务处理与外键和行级锁.而MyISAM不支持.myisam不支持事务,也不支持外键,其优势是访问速度快(INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多,并且会占用更多的磁盘空间以保留数据和索引),对事务完整性没有要

02: MySQL 索引类型 、 MySQL 存储引擎

day02一.mysql索引二.MySQL存储引擎+++++++++++++++++++++++++++++++++++一.mysql索引1.1 索引介绍 : 相当于 "书的目录" 5000页1~200 目录信息拼音排序部首排序笔画排序 201~5000 正文 1.2 索引的优点与缺点?优点 加快查询的速度缺点 占用物理存储空间,减慢写的速度. 姓名 性别 班级 年龄jimjimNULL 1.3 使用普通索引index:(在表中的字段上创建索引)使用规则?查看 desc 表名: key