一、介绍
Mysql的不同的存储引擎使用不同的存储机制、索引技巧、锁定水平并最终提供广泛的不同的功能和能力。
二、使用
create table TABLE_NAME(COLUMN TYPE) engine=Innodb;
alter table TABLE_NAME engine=Innodb;
三、区别
存储引擎 | 优势 | 劣势 | 适用场景 |
ISAM | 快速读取,不占用大量的内存和存储资源 | 不支持事务、外键、索引 | |
MyISAM | 快速读取,不占用大量的内存和资源,支持全文索引与停止词(FULLTEXT) | 不支持事务、外键 | count频繁; 插入不频繁; 查询频繁; 不需要事务,对事物完整性(脏读,不可重复读,幻读)无要求 |
HEAP(内存) | 插入、更新和查询效率极高,默认使用hash索引 | 只驻留在内存里的临时表格,保存的数据具有不稳定性 | 用于临时表 |
InnoDB | 有事务,崩溃恢复能力的失误安全存储引擎; 唯一拥有行锁的存储引擎; 唯一支持外键约束; 支持自增列; 自动灾难恢复 | 读取速度比ISAM慢, 写入速度比MyISAM慢, 占用更多磁盘以保留数据和索引 | 表更新和查询都相当频繁,而且表锁定的计划比较大的情况 |
ARCHIVE | 有高效的插入速度 | 不支持索引,仅支持insert和select | 存储大量独立的、作为历史记录的数据,如日志记录和聚合分析 |
MEMORY(内存) | 效率非常高,默认hash索引 | 数据不稳定 | 用于内容变化不频繁的表,或者统计操作的中间结果表,便于高效地对中间结果进行分析得到最终结果。 |
1、MyISAM
支持三种不同的存储格式:静态表、动态表、压缩表
静态表:表中记录都是非变长的字段,这样每个记录都是定长的,优点是存储非常迅速,出现故障容易恢复;缺点是占用的空间通常比动态表多(因为存储时会按定长补空格。取数据的时候默认会去掉空格,所以有可能会吧数据本身的空格也去掉)
动态表:记录不固定长度。优点是占用空间少;缺点是频繁的更新、删除数据容易产生数据碎片,需要定期执行OPTIMIZE TABLE或者myisamchk-r命令来改善性能。
压缩表:每条记录都是被单独压缩的,所以只有非常小的访问开支。
2、 MEMORY
在内存中建表,每个MEMORY只实际对应一个磁盘文件,格式是frm。memory类型的表访问非常快,可以使用b-tree索引或者hash索引,默认使用hash索引。
★ hash索引优点:
因为hash索引结构的特殊性,其检索效率非常高。Hash索引的检索可以一次定位,不像b-tree索引需要从根节点到枝节点,最后到页节点多次的IO访问,所以hash索引的查询效率远高于b-tree索引。
InnoDB和MyISAM不支持hash索引。
★ hash索引缺点:
hash算法是基于等值计算的,所以对于“like”等范围查找,hash索引无效,不支持。
3、MERGE存储索引
是一组MyISAM表的组合,这些MyISAM表结构必须完全相同,merge表本身没有数据,对merge类型的表可以进行查询,更新,删除操作,这些操作实际上是在操作内部的MyISAM表。
如何选择合适的存储引擎?
(1)是否需要事务?
(2)是否需要热备?
(3)是否能接受崩溃?
(4)是否需要外键。
关于mysql中文乱码:
mysql有六处使用了字符集,分别为:client 、connection、database、results、server 、system。
client是客户端使用的字符集。
connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。
database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
server是服务器安装时指定的默认字符集设定。
system是数据库系统使用的字符集设定。