MyISAM存储引擎

缺点:不支持事务,不支持外键。只支持表级锁。

优点:访问速度快,多用于select、insert语句的高负载操作。仅仅支持全文索引。

MyISAM缓存在内存的是索引,不是数据。而InnoDB缓存在内存的是数据,相对来说,服务器内存越大,InnoDB发挥的优势越大

Myisam的存储文件:

每个MyISAM在磁盘上存储程3个文件,文件名和表名是相同的,仅仅扩展名不一样:

  1、filename.frm:存储表定义

  2、filename.MYD:mydata,即存储的数据

  3、filename.MYI:myindex,即存储的索引

解说:数据文件和索引文件可以放在不同的目录下,需要在创建表的时候通过特定的语句DATA DIRECTORY和INDEX DIRECTORY来指定。

MyISAM类型的表可能会损坏影响访问,我们需要MyISAM类型的表提供的修复工具来修复,

  1、CHECK TABLE 语句来检测表的健康状态

  2、REPAIR TABLE语句来修复一个损坏的MyISAM表。

MyISAM类型的表支持的三种存储结构:

1、静态型

  静态表是默认的存储格式,静态表中的字段都是非变长字段,例如CHAR等长度不可变的数据类型。

  优点:存储速度快,表的性能比较高,容易缓存,出现故障容易恢复。

  缺点:占用的空间比较大,因为在定义的时候是固定的,所以不管列中的值有多大,都会以最大值为准,占据了整个空间。

  我们之前学过VARCHAR和CHAR的区别,在存取尾部带有空格字符的字符串的时候,我们取数据时VARCHAR取出来的字符串尾部带有空格(保留空格),而CHAR类型取出来的字符串尾部的空格字符则会被去掉。同样在这里也是,因为我们MyISAM的表在创建的时候如果是静态表存储格式,那么我们也要注意:如果需要保存的内容后面本来就带有空格,那么在返回的结果也会被去掉。

  还要注意的是:静态表中的数据在存储时是按照列的宽度定义补足空格,但是在应用访问的时候并不会得到这些空格,这些空格在返回前已经被去掉了。此外静态表是MyISAM存储引擎默认的存储格式。

2、动态型

  如果列(即使只有一列)定义为动态的数据类型,例如BLOB、TEXT、VARCHAR等变长数据类型。这时MyISAM就自动使用动态型表存储格式。

  优点:占用的空间相对较少。

  缺点:虽然动态型的表占用了比静态型表较少的空间,但带来了性能的降低,因为如果某个字段的内容发生改变则其位置很可能需要移动,这样就会导致碎片的产生。随着数据变化的怎多,碎片就会增加,数据访问性能就会相应的降低。

  对于因为碎片的原因而降低数据访问性,有两种解决方法:

    1、尽可能使用静态数据类型 

    2、定期执行OPTIMIZE TABLE语句或者myisamchk-r命令来改善性能。

3、压缩表

  压缩表有myisampack工具创建,占据非常小的磁盘空间。

InnoDB存储引擎

 优缺点

优点:支持事务,具有提交、回滚、崩溃恢复能力等。支持主键外键约束。支持并发量大,适用于大量的UPDATE、INSERT操作。

缺点:InnoDB写的处理效率差一点,并会占用更多的磁盘空间以保留数据和索引。不支持全文索引。大量的SELECT操作的查询速度不如MyISAM存储引擎。

InnoDB存储引擎的表的特点:

1、支持外键约束,详细参考之前的文章。

2、支持AUTO_INCREMENT,详细参考之前的文章。

存储方式

InnoDB存储表和索引有两种方式

1、使用共享表空间存储

这种方式创建的表的表结构保存在.frm文件中。

共享表空间存储 多表空间存储

创建的表的表结构保存在.frm文件中。

表存放在innodb_data_home_dir和innodb_data_file_path定义的表空间中。

创建的表的表结构仍然保存在.frm文件中。但是每个表的数据和索引又单独保存在.ibd文件中。

对于分区表,也有对应的.ibd文件,详细查阅资料。

注意:要使用多表空间的存储方式,需要设置参数“innodb_file_per_tale”。(如下所示说明存储引擎使用了多表空间的存储方式。)。并且还要重新启动服务后才能生效。

疑问处理:

1、对于使用多表空间存储的参数对新建的表的什么时候才会生效问题。

  1、对于新建的表按照多表空间的方式创建,已有的表仍然使用共享表空间存储。

  2、如果将已有的多表空间方式修改回共享表空间的方式,则新建表会在共享表空间中创建,但是已有的多表空间的表仍然保存原来的访问方式。

  总结:多表空间的参数生效后,只对新建的表生效。

2、看了上面的理论知识,有人认为是否可以把.frm和.ibd的文件复制一下直接到别的数据库恢复一下呢?

  不可以的,至于原因我们可以参考深入浅出mysql的第140页来查看。我们大多数情况下是将单表恢复到目标数据库,还是需要mysqldump和mysqlimport命令来实现。

3、是否在多表空间的存储方式下,共享表空间就不需要了呢?

  不是的,即便在多表空间的存储方式下,共享表空间仍然是必须的。因为InnoDB要把内部数据词典和在线重做日志放在这个文件中。

MySQL的数据存放的目录下,在创建的数据库名字下有个.opt文件,有什么作用呢?

  答:在某些库目录下有个db.opt文件,那这个文件是干什么用的呢?如果你用记事本txt等编辑器打开看的话,内容很简单,是用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性

MySQL基础之 存储引擎的更多相关文章

  1. mysql基础之存储引擎

    原文:mysql基础之存储引擎 数据库对同样的数据,有着不同的存储方式和管理方式,在mysql中,称为存储引擎 常用的表的引擎 Myisam ,批量插入速度快, 不支持事务,锁表 Innodb, 批量 ...

  2. MySQL基础day03 存储引擎和外键MySQL 5.6

    MySQL基础day03_存储引擎和外键-MySQL 5.6 外键的条件: 1,表的存储引擎为innodb存储引擎 2,表中外键字段的类型要与参考表的字段类型一致 3,外键字段要是索引类型中的一种 M ...

  3. MySQL的多存储引擎架构

    支持多种存储引擎是众所周知的MySQL特性,也是MySQL架构的关键优势之一.如果能够理解MySQL Server与存储引擎之间是怎样通过API交互的,将大大有利于理解MySQL的核心基础架构.本文将 ...

  4. MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析

    文/何登成 导读:   来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解I ...

  5. MySql的多存储引擎架构, 默认的引擎InnoDB与 MYISAM的区别(滴滴)

    1.存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...

  6. MySQL事务以及存储引擎

    MySQL事务以及存储引擎 目录 MySQL事务以及存储引擎 一.事务 1. 事务的概念 2. 事务的ACID特点 (1)原子性 (2)一致性 (3)隔离性 ①事务之间的相互影响 ②MySQL事务支持 ...

  7. Mysql更换MyISAM存储引擎为Innodb的操作记录

    一般情况下,mysql会默认提供多种存储引擎,可以通过下面的查看: 1)查看mysql是否安装了innodb插件.通过下面的命令结果可知,已经安装了innodb插件. mysql> show p ...

  8. mysql缓存、存储引擎

    一.         mysql查询缓存 查询缓存不是mysql的子系统,却是查询优化和执行子系统不可缺少的组成部分.它不仅可以缓存查询结果,还可以缓存查询结果本身.如果某个查询的结果就在缓存里, 系 ...

  9. 转!!MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)

    MySQL中的存储引擎: 1.存储引擎的概念 2.查看MySQL所支持的存储引擎 3.MySQL中几种常用存储引擎的特点 4.存储引擎之间的相互转化 一.存储引擎: 1.存储引擎其实就是如何实现存储数 ...

随机推荐

  1. C# WebApi 中设置Session可用

    在Global.acax中,添加下面方法 //设置session可用 public override void Init() { PostAuthenticateRequest += MvcAppli ...

  2. Git(二)_基本命令

    0. 开始查看所有配置:git config --listgit config --global user.name "runoob"git config --global use ...

  3. EWS 邮件提醒

    摘要 之前做的邮件提醒的项目,最近需要优化,由于使用了队列,但即时性不是特别好,有队列,就会出现先后的问题,最近调研了exchange 流通知的模式,所以想使用流通知模式和原先的拉取邮件的方法结合,在 ...

  4. Java基础——GUI编程(一)

    一.定义 GUI全称是Graphical User Interface,即图形用户界面.JDK中提供了AWT 和 Swing 两个包,用于GUI程序的设计和开发. 1.java .awt  abstr ...

  5. 【Redis】1、Jedis对管道、事务以及Watch的操作来应对高并发

    对于一个互联网平台来说,高并发是经常会遇到的场景.最有代表性的比如秒杀和抢购.高并发会出现三个特点: 1.高并发读取 2.高并发写入(一致性) 3.出现超卖问题 前端如何应对? 1.缓存静态数据,例如 ...

  6. gradle tool升级到3.0注意事项

    Gradle版本升级 其实当AS升级到3.0之后,Gradle Plugin和Gradle不升级也是可以继续使用的,但很多新的特性如:Java8支持.新的依赖匹配机制.AAPT2等新功能都无法正常使用 ...

  7. 在pycharm中进行ORM操作

    打开manage.py, 复制 import..... if.......os.....  导入django,开启django, 导入app中的models  orm操作 import os if _ ...

  8. js之展开收缩菜单,用到window.onload ,onclick,

    目标效果:点击标签1,如果列表标签的style的display是block,改成none,否则改成block,来达到展开收缩菜单效果 一.准备阶段 html文件 <!DOCTYPE html&g ...

  9. PDO中的预处理

    PDO中的基本的原理和步骤和MySQL中的预处理都是一样的,只不过就是把MySQL中的预处理所有命令行的语法封装成了PDO对象的几个公开的方法而已! 1.发送预处理语句 此时,我们需要调用pdo对象的 ...

  10. 利用 js-xlsx 实现 Excel 文件导入并解析Excel数据成json格式的数据并且获取其中某列数据

    演示效果参考如下:XML转JSON 另一个搭配SQL实现:http://sheetjs.com/sexql/index.html 详细介绍: 1.首先需要导入js <script src=&qu ...