文章目录
- 一、MyISAM存储引擎
- 1、1加锁与并发
- 2、1修复
- 3、1索引特性
- 3、4 延迟更新索引键
- 3、5 MyISAM 压缩表
- 3、6 MyISAM 性能
- 二、MySQL 存储引擎 MyISAM 与 InnoDB 如何选择?
- 一、InnoDB支持事务,MyISAM不支持,这一点是非常重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
- 二、MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
- 三、InnoDB支持外键,MyISAM不支持
- 四、MyISAM需要指定,InnoDB是默认引擎
- 五、InnoDB中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时MyISAM也需要扫描整个表
- 六、对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
- 七、清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
- 八、InnoDB支持行锁而MyISAM不支持
- 三、MyISAM建表以及相关文件结构
一、MyISAM存储引擎
作为 MySQL 最早的存储引擎之一,MyISAM 有一些已经开发出来很多年的特性,可以满足用户的实际需求。
1、1加锁与并发
MyISAM 对整张表加锁,而不是针对行。读取时会对需要读到的所有表加共享锁,写入时则对表添加排它锁。但是在表有读取查询时, 也可以往表中插入新的记录。
2、1修复
对于 MyISAM 表,MySQL 可以手工或者自动执行检查和修复操作,但这里说的修复和事务修复以及崩溃修复是不同的概念。执行表的修复可能会丢失一部分数据,而且修复操作是非常慢的。
3、1索引特性
对于 MyISAM 表,即使是 BLOB 和 TEXT 等长字段,也可以基于其前 500 个字符创建索引。MyISAM 也支持全文索引,这是一种基于分词创建的索引,可以支持复制的查询。
3、4 延迟更新索引键
创建 MyISAM 表的时候,如果指定了 DELAY_KEY_WRITE 选项,在每次修改执行完成时,不会立刻将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区(in_memory key buffer),只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入到磁盘。这种方式可以极大地提升性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。延迟更新索引键的特性,可以在全局设置,也可以为单个表设置。
3、5 MyISAM 压缩表
如果表在创建并导入数据以后,不会在进行修改操作,那么这样的表或者适合采用 MyISAM 压缩表。
可以使用 myisampack 对 MyISAM 表进行压缩。压缩表是不能进行修改的。压缩表可以极大地减少磁盘空间占用,因此也可以减少磁盘 I/O,从而提升查询性能。压缩表也支持索引,但索引也是只读的。
3、6 MyISAM 性能
MyISAM 引擎设计十分简单,数据以紧密格式存储,所以在某些场景下的性能很好。MyISAM 有一些服务器级别的性能扩展限制。但是 MyISAM 最典型的的性能问题还是 表锁的问题。
二、MySQL 存储引擎 MyISAM 与 InnoDB 如何选择?
虽然MYSQL数据库中存储引擎种类很多,但是常用的就是MyISAM和Innodb,那么他们两个是如何选择的呢!
一、InnoDB支持事务,MyISAM不支持,这一点是非常重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
二、MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
三、InnoDB支持外键,MyISAM不支持
四、MyISAM需要指定,InnoDB是默认引擎
五、InnoDB中不保存表的行数,如select count() from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时MyISAM也需要扫描整个表
六、对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
七、清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
八、InnoDB支持行锁而MyISAM不支持
三、MyISAM建表以及相关文件结构
use hr;
create table test_mim(id int, c1 varchar(10)) engine=myisam;
执行完上面的代码,会在hr数据库目录文件下,创建四个文件:db.opt -----> 主要记录当前数据库的默认字符集及字符序等信息(已经有了)
文件目录:data/mysql_data下存放相关数据库
文件目录:cd data/mysql_data/hr/
test_mim.frm -----> 表结构定义文件
test_mim.MYD -----> 用于存放数据
test_mim.MYI -----> 用于存放索引