MySQL有多种存储引擎:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。



每种存储引擎有各自的优缺点,以下列出常用几种的特点:



MyISAM

  • 表级锁
  • 数据非自动恢复
  • 不支持事务
  • 仅索引加载在内存中,数据缓存由操作系统储存在文件中
  • 紧凑的数据存储,正是这样才能实现高速的数据扫描

HEAP

  • 表级锁
  • 不支持动态数据类型Text和BLOB,varchar会被当做成char来处理
  • 默认索引类型是Hash索引
  • 不支持索引统计
  • MySQL数据库服务器重启后数据全部丢失

InnoDB

  • 支持事务
  • 支持外键(version 5.0,only the storage engine level support)
  • 行级锁
  • 多版本支持
  • 主键聚集,所有InnoDB表都依赖于主键聚集
  • 所有的非主键索引内容包含主键列的值
  • 最优化缓存,缓存中包含索引和数据,innodb_buffer_pool_size.InnoDB缓存采用的是自动hash便于查找
  • 非压缩的索引
  • 缓慢的数据加载,因为MySQL 5.0没有特别优化数据加载操作,每条记录建一次索引,所以大数据量的服务重启会很慢。
  • AUTO_INCREMENT锁表,在MySQL 5.1以前的InnoDB中,如果主键列采用了AUTO_INCREMENT则是表级锁。在MySQL5.1以后支持innodb_autoinc_lock_mode,默认值1,含义是bulk insert。0是传统的表级锁,2是交叉的表级锁(interleaved:fastest and most scalable lock mode,but not safe)。
  • 不缓存COUNT(*)的值


Mysql该如何选择储存引擎:

1.>采用MyISAM

读写比>100:1的 而且更新比较小;

并发不高,不需要事务;

表数据量较小;

硬件资源有限;

2.>采用InnoDB引擎;

读写比较小,频繁更新;

表的数据量较大,超过千万,并发高;

安全性和可靠性高;

3.>采用HEAP(Memory)引擎

有足够的内存;

对数据的一致性要求不高,如在线人数和session等应用;

需要定期归档的数据;


mysql服务器优化措施:

  1. 适度使用Query Cache
  2. 增加MySql允许的最大连接数
  3. 对于MyISAM表适当增加key_buffer_size,如果key_cache命中率的值大于%1就要适当增加key_buffer_size的值。
  4. 对于MyISAM需要注意table_cache的设置,需要适当确定table_cache的大小,过小的话,系统的table_cache不够用的时候,会采用LRU适当踢掉最长时间没有使用的表。
  5. 从表中删除大量的行后,可运行OPTIMIZE TABLE TableName进行碎片整理。

本帖参考了PHP核心技术与最佳实践一书。


转载于:https://blog.51cto.com/webcrawler/1202122