MyISAM 存储引擎的特点及其优化方法

MyISAM 简介

MyISAM管理非事务表,是ISAM的扩展格式,除了提供ISAM里所没有的索引的字段管理等大量功能外,还是用一个表格锁定的机制,来优化多个并发的读写操作。MyISAM提供高速检索,以及全文搜索能力; 在MySQL5.5以前的版本的MySQL配置中支持,也是默认的存储引擎。

特性

  1. 不支持十五,不具备AICD特性(原子性,一致性,分离性 ,永久性);
  2. 表级别锁定形式(更新数据是锁定整个表,这样`虽然可以让锁定的实现成本很小但是会大大的降低了并发的性能.)
  3. 读写相互阻塞(不仅在写入的时候阻塞读取,还会在读取的时候阻塞写入,但是读取不会阻塞读取)
  4. 只会缓存索引(MyISAM 通过key_buffer_size来设置缓存索引,提高访问性能,减少磁盘I/O的压力,但是只缓存索引,不缓存数据);
  5. 读取速度快,占用资源较少。
  6. 不支持外键约束,支持全文检索。
  7. 支持数据压缩(对某些只读大表进行压缩).

应用场景

  1. 不需要事务支持的场景。(参见特性第 1 条)
  2. 读多或者写多的单一业务场景,若读写都频繁则不适合,会阻塞(参见特性的第 3 条。)
  3. 读写并发访问较低的业务(特性第 2 条)
  4. 数据修改相对较少的业务.(特性第2,3条,修改本质就是先读后写,所以会导致表锁定,读写相互阻塞等)
  5. 以读为主的业务(博客,图片信息数据库,用户数据库等)(参见应用第 2 条)
  6. 对数据的一致性要求不是很高的业务 (不支持事务)
  7. 服务器硬件资源相对较差的机器,一般为中小型网站(参见第 4, 5 条)
  8. 总结:非事务型应用(不涉及到金融),只读类(如日志),空间类(GPS等),只有MyISAM支持空间类哦.

调优精要

  1. 设置合适的索引(缓存机制)
  2. 调整读写优先权限,根据业务需求,确保重要操作更有执行权限。
  3. 启用延时插入(尽量批量插入,降低写的频率)
  4. 写数据的时候,顺序操作,让insert数据都写入到尾部,减少阻塞
  5. 分解大的时间长的操作,降低单个操作的阻塞时间
  6. 降低并发数(减少数据库的访问,高并发场景下,可以使用队列机制)
  7. 对于静态更新不频繁的数据库数据,充分利用Query Cache或者Memcached缓存服务,极大可能的提高访问效率
  8. count的时候,只有count(*)会直接返回行数,才是效率最高的;带有WHERE 子句的count都需要全表扫描
  9. 可以配置主从数据库的时候,主数据库使用InnoDB,从数据库使用MyISAM,进行读写分离.

存储

在存储的时候,每一个MyISAM的表都对应硬盘上的三个文件(同意文件名,不同扩展名)

.frm :保存表的定义,这个文件不是MyISAM引擎的一部分,时数据库服务器的一部分

.MYD : 保存表的数据

.MYI : 保存表的索引文件。

(.MYD 和 .MYI 时MyISAM 的关键点)