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服务器优化措施:
- 适度使用Query Cache
- 增加MySql允许的最大连接数
- 对于MyISAM表适当增加key_buffer_size,如果key_cache命中率的值大于%1就要适当增加key_buffer_size的值。
- 对于MyISAM需要注意table_cache的设置,需要适当确定table_cache的大小,过小的话,系统的table_cache不够用的时候,会采用LRU适当踢掉最长时间没有使用的表。
- 从表中删除大量的行后,可运行OPTIMIZE TABLE TableName进行碎片整理。
本帖参考了PHP核心技术与最佳实践一书。
转载于:https://blog.51cto.com/webcrawler/1202122