mysql 系统性浅聊 myisam 存储引擎【原创】
- 》》思维导图
- 》》介绍
mysql中的存储引擎都是以插件的形式存在,目前用的最多存储引擎就是innodb和myisam。MySQL5.5.5以后(包括5.5.5)默认使用InnoDB存储引擎,之前的版本基本就是MyISAM的了。现在有很多人都在网上问,innodb作为存储引擎之后,myisam引擎是不是要被淘汰了?其实它们两者之间各有优势,暂时还不能说谁替代谁,不存在滴。
- 》》存储结构
创建一个myisam数据表
- mysql> create table myisam(
- -> id int not null primary key auto_increment,
- -> cs varchar(50) not null comment 'test'
- -> )engine=myisam default charset=utf8;
- Query OK, 0 rows affected (0.10 sec)
查看表结构(具体的查看和操作,请看上篇MySQL查看和修改表的存储引擎)
- mysql> show create table myisam;
- +--------+----------------------------------------------------------------------
- --------------------------------------------------------------------------------
- -----------------+
- | Table | Create Table
- |
- +--------+----------------------------------------------------------------------
- --------------------------------------------------------------------------------
- -----------------+
- | myisam | CREATE TABLE `myisam` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `cs` varchar(50) NOT NULL COMMENT 'test',
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
- +--------+----------------------------------------------------------------------
- --------------------------------------------------------------------------------
- -----------------+
- 1 row in set (0.00 sec)
再具体看下底层的myisam数据表的文件组成:
windows下的表结构:
linux下的表结构是一样的,我就不贴出来了。
看到myisam表是由.frm, .MYD, .MYI三个文件组成:
.frm 是表结构文件
.MYD 是数据文件
.MYI 是索引文件
- 》》特性--不支持事务
例子如下:
--》上面已经创建了一个myisam表,表结构如下:
- mysql> desc myisam;
- +-------+-------------+------+-----+---------+----------------+
- | Field | Type | Null | Key | Default | Extra |
- +-------+-------------+------+-----+---------+----------------+
- | id | int(11) | NO | PRI | NULL | auto_increment |
- | cs | varchar(50) | NO | | NULL | |
- +-------+-------------+------+-----+---------+----------------+
- 2 rows in set (0.00 sec)
--》操作如下:
--》好吧!没有对比就没有伤害!下面试下Innodb是否成功:
- 》》特性--修复表
主要两个SQL操作语句:
check table YOUR_TABLE_NAME
repair table YOUR_TABLE_NAME
实例如下:
注意:这里的修复表,并不是说可以将之前删除的数据找回来,切记切记!
- 》》特性--加锁和并发
- 》》特性--列索引以及延迟索引
列索引,其实在这里我并不想写太多,后面我会专门写一篇关于如何建立索引,注意事项以及如何优化索引。
这里我主要想讲的是延迟索引这个参数,挺有意思的,myisam专有物。
延迟更新索引,MYISAM 默认把DELAY_KEY_WRITE开启, 整个选项是MYISAM引擎独有的。
很多人都知道在建立索引上的表进行写操作时,插入大量数据的速度会非常慢,很多办法是先关闭索引,然后插入数据,再打开索引。其实将delay_key_write选项打开,可以得到一定程度的插入速度优化。如果你的某个表有很多update操作,这个参数的优势会很好的体现出来。因为这个参数能延迟更新索引到表关闭。再提醒一次:
注意:DELAY_KEY_WRITE选项是MYISAM存储引擎的专有的
- 》》特性--表压缩
主要使用myisampack命令
由于这张表是空表,所以在压缩的时候加了-f,表示强制压缩。下面看下压缩后的文件大小:
大家有没有发现多了一个OLD文件,这是对原来MYI文件的一个备份,之前是0kb,然后再看下新的MYI文件,目前是1.0K,压缩后的文件没有变小反而变大了,为什么呢?
这是由于原文件是个空文件,强制压缩之后肯定会比原文件大的,多了一些乱七八糟的东西在里面啦。
注意:压缩后的文件再执行写操作时会报错,这是由于压缩后的文件会变成只读状态!!切记啊。
- 》》基础限制
在版本 < MySQL 5.0 时默认表的大小为4G,这对于一些大业务的数据来说是不够的。
有什么办法可以扩展吗?有的。
如存储大表则要修改MAX_Rows 和 AVG_ROW_LENGTH这两个选项。但是一定配置了这两个参数后,表会立刻重写。
所以最好的建议就是更新MySQL的版本啦。
在版本 > MySQL 5.0 时默认表的大小为256TB,这对于我们绝大部分的业务来说都是足够的了。
- 》》应用场景
最后来说下myisam存储引擎适合使用在哪些应用场景下:
1.看了上面的特性,其实我们很容易知道,需要用到事务型的应用都不适合,只能使用在非事务型应用。
2.对于锁表而不是锁行的行为,同样的myisam不适合用在频繁操作写的应用下,这会造成阻塞,最好用在只读类应用下。
3.这个就比较特殊了,上面也没提到过,空间类应用,在MySQL 5.7只前,myisam是唯一支持空间函数的存储引擎,如果想存储空间数据例如GPS数据,或者使用空间函数运算的话,只能使用MyISAM存储引擎。
欢迎留言。O(∩_∩)O哈哈~
mysql 系统性浅聊 myisam 存储引擎【原创】的更多相关文章
- Mysql更换MyISAM存储引擎为Innodb的操作记录
一般情况下,mysql会默认提供多种存储引擎,可以通过下面的查看: 1)查看mysql是否安装了innodb插件.通过下面的命令结果可知,已经安装了innodb插件. mysql> show p ...
- MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)
简单来说,存储引擎就是指表的类型以及表在计算机上的存储方式. 存储引擎的概念是MySQL的特点,Oracle中没有专门的存储引擎的概念,Oracle有OLTP和OLAP模式的区分.不同的存储引擎决定了 ...
- (MariaDB/MySQL)MyISAM存储引擎读、写操作的优先级
MariaDB/MySQL中使用表级锁的存储引擎(例如MyISAM.Aria(MariaDB对MyISAM引擎的改进,前身是MyISAM))在读(select).写操作(insert.delete.u ...
- MySQL数据库MyISAM存储引擎转为Innodb
MySQL数据库MyISAM存储引擎转为Innodb 之前公司的数据库存储引擎全部为MyISAM,数据量和访问量都不是很大,所以一直都没什么问题.但是最近出现了MySQL数据表经常被锁的情况,直接导 ...
- mysql的innodb存储引擎和myisam存储引擎的区别
主要区别如下: 1.事务支持.innodb支持事务,事务(commit).回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transacti ...
- [MySQL Reference Manual]15. 其他存储引擎
15. 其他存储引擎 15. 其他存储引擎 15.1 设置存储引擎 15.2 MyISAM存储引擎 15.2.1 MyISAM启动选项 15.2.2 Key的空间要求 15.2.3 MyISAM表存储 ...
- MySQL 远程连接(federated存储引擎)
标签:federated存储引擎 概述 本文主要介绍通过federated存储引擎建立远程连接表 测试环境:mysql 5.6.21 步骤 开启federated存储引擎 先查看federated存储 ...
- MySQL学习笔记七:存储引擎
1.MySQL存储引擎的设计采用“插件式”方案,用户可以很方便地选择使用哪种存储引擎,想使用mysql没有提供的引擎时,可以自己安装进去. 查看支持的存储引擎 mysql> show engin ...
- MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述
MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...
随机推荐
- Shuffle过程的简单介绍
Shuffle是连接Map和Reduce的桥梁 Shuffle分为Map端的Shuffle和Reduce端的Shuffle Map端的shuffle 1输入数据和执行任务: 分片后分配Map任务,每个 ...
- grunt concat针对有依赖文件的js脚本的合并
grunt concat针对有依赖文件的js脚本的合并: 在一个入口文件index.js里,有很多依赖文件,主要分两类,一类是和主文件同目录,另一类是其他目录下的js(cmd.非cmd的js文件,一般 ...
- Problem B: 农夫果园 简单点,出题的方式简单点
我走过最长的路,就是教主的套路#include <iostream> #include <string> using namespace std; class Fruit { ...
- 一些神奇的JS功效
1: 沉睡排序 var numbers=[1,2,3,4,5,5,99,4,20,11,200]; numbers.forEach((num)=>{ setTimeout(()=>{ co ...
- HTTPCLIENT 模拟登陆
第一步构建忽略https验证的httpclient public static CloseableHttpClient getHttpClient() throws Exception { SSLCo ...
- [Intel Edison开发板] 06、Edison开发在linux中烧写、配置、搭建开发环境
1.前言 linux上烧写.配置.搭建Edison环境,千万不要用默认的setup tool for ubuntu!!! (即使,你用的就是ubuntu) 因为,其默认的工具会从一个坏链接下载配置文件 ...
- c#中的Out, params,ref 细说并沉淀
1. Out,params,ref之前先记录平时用的最多的按值传递参数的情况,当然默认情况下参数传入函数的默认行为也是按值传递的. 1: //默认情况下参数会按照值传递 2: static int a ...
- flex词法解析
例子1.从标准输入的字数.单词.行数统计 %{ #include <string.h> int chars = 0; int lines = 0; int words = 0; %} %% ...
- cgg之字面值
字面值时源代码中用来描述固定值的记号,可能是整数.浮点数.字符或者字符串 2.1 整数常量 除了常见的十进制数外,还有八进制(以数字0开头)或者十六进制(0x/0X)表示法. #include < ...
- php中向前台js中传送一个二维数组
在php中向前台js中传送一个二维数组,并在前台js接收获取其中值的全过程方法: (1),方法说明:现在后台将数组发送到前台 echo json_encode($result); 然后再在js页面中的 ...