【存储引擎】
MySQL中的数据用各种不同的技术存储在文件(或内存)中,这些技术中的每一种技术都使用不同的存储机制,索引技巧,锁定水平并且最终提供广泛的不同功能和能力。在MySQL中将这些不同的技术及配套的相关功能称为存储引擎。
在选择存储引擎时,需要考虑一下几点:
是否有外键吗?
InnoDB支持外键,MyISAM不支持
是否需要事务支持吗?
InnoDB支持事务,MyISAM不支持
是否经常使用什么样的查询模式?
1.COUNT()在 MyISAM 表中会非常快,而在InnoDB 表下可能会很痛苦
2.主键查询在InnoDB下相当快,但如果主键太长了也会导致性能问题
3.MyISAM适合select以及insert为主的应用,InnoDB适合频繁update以及涉及到安全性较高的应用
数据有多大?
1.大尺寸的数据集趋向于选择InnoDB方式,因为其支持事务处理和故障恢复。
2.数据库的大小决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,速度比较快。
◆是否需要全文索引吗?
MyISAM支持全文索引
InnoDB也支持FULLTEXT类型的索引
【注意,最后一条特别列举出来,其实从MySQL5.5开始就已经支持了,但是网上很多地方都说不支持,千万注意!】
根据经验来看,如果是一些小型的应用或项目,那么MyISAM 也许会更适合。
需要记住InnoDB 的表需要更多的内存和存储,转换100GB 的MyISAM 表到InnoDB 表可能会让你有非常坏的体验。
【区别总结】
1.InnoDB支持外键与事务
2.InnoDB 中不保存表的具体行数,执行select count(*) from table时,InnoDB要扫描一遍整个表,但是MyISAM只要简单的读出保存好的行数即可。但是,当count(*)语句包含where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.delete from table清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
6.InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%” 。