MySQL学习笔记(2) - MyISAM存储引擎

在5.5版本之前,MyISAM是MySQL默认的存储引擎。MyISAM不支持事务、也不支持外键,其优势是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用都可以使用这个引擎来创建表。每个MyISAM在磁盘上存储成3个文件,其文件名和表名相同,但扩展名分别是:

  • .frm(存储表的定义)
  • .MYD(MYData,存储数据)
  • .MYI(MYIndex,存储索引)

数据文件和索引文件可以分别存放在不同的目录,平均分布IO,以获得更快的速度。要指定索引文件和数据文件的路径,需要在创建表时通过DATA DIRECTORYINDEX DIRECTORY语句指定,也就是说不同的MyISAM表的索引文件和数据文件可以放到不同的路径下。文件路径要是绝对路径,并有访问权限。

MyISAM类型的表可能损坏,原因可能是多种多样的,损坏后的表可能不能被访问,会提示需要修复或者访问后返回错误的结果。MyISAM类型的表提供了修复工具,可以用 CHECK TABLE 语句来检查MyISAM的健康状态,并用 REPAIR TABLE 语句修复一个损坏的MyISAM表。表损坏可能导致数据库异常重启。

MyISAM表支持3中不同的存储格式,分别是:

  • 静态表(固定长度)
  • 动态表
  • 压缩表

静态表是默认的存储格式。静态表中的字段都是定长字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。静态表的数据在存储的时候会按照列的宽度定义补足空格,但是在应用访问的时候并不会得到这些空格,这些空格在返回给应用之前已经去掉了。

但是也有些需要特别注意的问题,如果需要保存的内容后面本来就带有空格,那么在返回结果的时候也会被去掉。下面的例子演示了插入的记录包含空格时的处理情况:

mysql> create table myisam_char (name char(10)) engine=myisam;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into myisam_char values(‘abcde‘),(‘abcde  ‘),(‘  abcde‘),(‘abcde  ‘);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0
mysql> select name,length(name) from myisam_char;
+---------+--------------+
| name    | length(name) |
+---------+--------------+
| abcde   |            5 |
| abcde   |            5 |
|   abcde |            7 |
| abcde   |            5 |
+---------+--------------+
4 rows in set (0.00 sec)

动态表中包含变长字段,记录不是固定长度的,这样存储的优点是占用空间相对较少,但是频繁的更新或删除记录会产生碎片,需要定期执行optimize table语句或myisamchk -r命令来改善性能,并且出现故障的时候恢复相对比较困难。

压缩表由 myisampack 工具创建,占据非常小的磁盘空间。因为每个记录是被单独压缩的,所以只有非常小的访问开销。

时间: 2024-11-08 22:49:29

MySQL学习笔记(2) - MyISAM存储引擎的相关文章

MySQL学习笔记七:存储引擎

1.MySQL存储引擎的设计采用“插件式”方案,用户可以很方便地选择使用哪种存储引擎,想使用mysql没有提供的引擎时,可以自己安装进去. 查看支持的存储引擎 mysql> show engines\G *************************** 1. row *************************** Engine: FEDERATED Support: NO Comment: Federated MySQL storage engine Transactions: N

MySQL学习笔记(四):存储引擎的选择

一:几种常用存储引擎汇总表 二:如何选择 ? MyISAM:默认的MySQL插件式存储引擎.如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性.并发性要求不是很高,那么选择这个存储引擎是非常适合的.MyISAM是在Web.数据仓储和其他应用环境下最常使用的存储引擎之一. ? InnoDB:用于事务处理应用程序,支持外键.如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多的更新.删除操作,那么InnoDB存储引擎应

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

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

MySQL学习笔记(13)之储存引擎

储存引擎 1.概念:数据库对同样的数据,有着不同的储存方式和管理方式. 2.MyISAM: 1.MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器:每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表明. 2.MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎. 3.MyISAM存储引擎特别适合在以下几种情况下使用: 3.1选择密集型的表.MyISAM存储引擎在筛选大量数据时非常迅速

mysql InnoDB 和 Myisam 存储引擎的区别

1. InnoDB 支持事物,Myisam 不支持事物 2. InnoDB 是行级锁,Myisam 表级锁 3. InnoDB 不支持全文索引,Myisam 支持全文索引,但不支持外键 4. InnoDB 在磁盘上是两个文件,Myisam 是三个文件 5 myISAM管理非事务表.它提供高速存储和检索,以及全文搜索能力.如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择 6InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持.如果应用中需要执行大量的INSER

MySQL数据库MyISAM存储引擎转为Innodb

MySQL数据库MyISAM存储引擎转为Innodb 之前公司的数据库存储引擎全部为MyISAM,数据量和访问量都不是很大,所以一直都没什么问题.但是最近出现了MySQL数据表经常被锁的情况,直接导致了用户连接网站时超时而返回502,于是决定把存储引擎转为Innodb的,以解决MyISAM的表锁问题.下面将操作步骤记录一下. 1.导出centos数据库的表结构 mysqldump -d -uxxx -p centos > centos_table.sql 其中-d参数表示不导出数据,只导出表结构

《mysql性能调优与架构设计》笔记: 二存储引擎

3.1 概述: 1,MYISAM 是mysql 5.5以前版本的默认引擎,5.5以后默认存储引擎是innodb 2.查看mysql存储引擎命令,在mysql>提示符下搞入show engines;字段 Support为:Default表示默认存储引擎 3.设置InnoDB为默认引擎:在配置文件my.cnf中的 [mysqld] 下面加入default-storage-engine=INNODB 一句 3.2 MYISAM存储引擎概述: 1,MyISAM 存储引擎的表在数据库中,每一个表都被存放为

MySQL之MyISAM存储引擎压缩表

一.介绍 MySQL的MyISAM存储引擎支持压缩表空间,压缩后的表空间会减少,但是压缩后的表是只读的,不能插入和更新数据,如果需要更新,则需要解压后更新,再压缩 . 二.案例 1.创建数据库,创建表并指定存储引擎为MyISAM,字符集为utf8 create database myisamdb; use myisamdb; create table myisam (id int unsigned auto_increment primary key, name varchar(20) not

(MariaDB/MySQL)MyISAM存储引擎读、写操作的优先级

MariaDB/MySQL中使用表级锁的存储引擎(例如MyISAM.Aria(MariaDB对MyISAM引擎的改进,前身是MyISAM))在读(select).写操作(insert.delete.update.replace)上有优先级的概念.默认情况下,写操作的优先级高于读操作.注:不适用于InnoDB存储引擎. 以MyISAM为例.当有进程正在写MyISAM表的时候,又有新的读操作.写操作出现,则会先执行完所有的写操作,等写完后才会读表.实际上并非总是先执行完所有写操作,因为有系统变量ma