MySQL基础之 存储引擎
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基础之 存储引擎的更多相关文章
- mysql基础之存储引擎
原文:mysql基础之存储引擎 数据库对同样的数据,有着不同的存储方式和管理方式,在mysql中,称为存储引擎 常用的表的引擎 Myisam ,批量插入速度快, 不支持事务,锁表 Innodb, 批量 ...
- MySQL基础day03 存储引擎和外键MySQL 5.6
MySQL基础day03_存储引擎和外键-MySQL 5.6 外键的条件: 1,表的存储引擎为innodb存储引擎 2,表中外键字段的类型要与参考表的字段类型一致 3,外键字段要是索引类型中的一种 M ...
- MySQL的多存储引擎架构
支持多种存储引擎是众所周知的MySQL特性,也是MySQL架构的关键优势之一.如果能够理解MySQL Server与存储引擎之间是怎样通过API交互的,将大大有利于理解MySQL的核心基础架构.本文将 ...
- MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析
文/何登成 导读: 来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解I ...
- MySql的多存储引擎架构, 默认的引擎InnoDB与 MYISAM的区别(滴滴)
1.存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...
- MySQL事务以及存储引擎
MySQL事务以及存储引擎 目录 MySQL事务以及存储引擎 一.事务 1. 事务的概念 2. 事务的ACID特点 (1)原子性 (2)一致性 (3)隔离性 ①事务之间的相互影响 ②MySQL事务支持 ...
- Mysql更换MyISAM存储引擎为Innodb的操作记录
一般情况下,mysql会默认提供多种存储引擎,可以通过下面的查看: 1)查看mysql是否安装了innodb插件.通过下面的命令结果可知,已经安装了innodb插件. mysql> show p ...
- mysql缓存、存储引擎
一. mysql查询缓存 查询缓存不是mysql的子系统,却是查询优化和执行子系统不可缺少的组成部分.它不仅可以缓存查询结果,还可以缓存查询结果本身.如果某个查询的结果就在缓存里, 系 ...
- 转!!MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)
MySQL中的存储引擎: 1.存储引擎的概念 2.查看MySQL所支持的存储引擎 3.MySQL中几种常用存储引擎的特点 4.存储引擎之间的相互转化 一.存储引擎: 1.存储引擎其实就是如何实现存储数 ...
随机推荐
- 我进行jvm内存调优的一些记录
jvm内存调优的一些记录 java内存调优的方法和过程 可以使用 jmap -heap pid号 查看,例如pid是9300,执行的结果可能是这样的. root@ubuntu:~# jmap -hea ...
- Eclipse 4.3 Kepler最快汉化方法
eclipse 4.3汉化 eclipse 4.3 ---kepler已经于2013年6月26日发布主要版本,详见:eclipse in wikipedia 1.上eclipse官网:http:/ ...
- .net开源项目整理
整理一些平时收藏和应用的开源代码,方便自己学习和查阅 1.应用 nopcommerce,开源电商网站,开发环境asp.net mvc(未支持.net core),使用技术(autofac,ef,页面插 ...
- Oracle 图解安装
1.找到安装exe打开. 2. 3. 4. 5. 6. 7. 8.
- [css3] 看博客学习别人的旋转的星球
定义一个div 太阳轨道sunline,边框显示出来,定义position为relative #sunline{ width: 500px; height: 500px; border:2px sol ...
- HDU6154
CaoHaha's staff Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HttpClient的用法
客户端模拟http请求工具 Postmen(谷歌插件).RestClient 服务器模拟http请求工具 httpclient.HttpURLConnection httpCient请求代码 /** ...
- [基础知识]在PeopleSoft中SMTP设置不生效如何查找问题
在PeopleSoft中如果配置了工作流邮件或者标准页面的通知,都是可以发送出邮件的,这些邮件都是由SMTP服务器发送.SMTP需要在APP服务器和PRCS服务器中配置. 如果无法从PeopleSof ...
- PDO预处理语句
1.造PDO对象$dsn = "mysql:dbname=mydb;host=localhost";$pdo = new PDO($dsn,"root",&qu ...
- Jenkins 为Jenkins添加Windows Slave远程执行python项目脚本
为Jenkins添加Windows Slave远程执行python项目脚本 by:授客 QQ:1033553122 测试环境 JAVA JDK 1.7.0_13 (jdk-7u13-windows ...