mysql常用引擎有两个myisam和 innoDB;两个引擎的区别网上有大把资料可以查询;
应用上主要区别如下:
1、InnoDB支持事务,MyISAM不支持
2、InnoDB支持外键,而MyISAM不支持
3、InnoDB支持行级锁和表级锁,默认是行锁;MYISAM只支持表级锁
下面说一下这两个引擎索引的主要区别:
第一个重大区别是InnoDB的数据文件本身就是索引文件。MYISAM索引文件和数据文件 是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶子节点data哉保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
第二个与MYISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。所以辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中 检索获得记录。所以不建议使用过长的字段作主键。
小知识:
MYISAM会把自增主键的最大ID记录到数据文件里,重启MYSQL自增主键的最大ID不会丢失;
InnoDB把自增主键最大ID记录到内存中,所以重启数据库会导致最大ID丢失。
MYISAM允许没有主键
InnoDB必须有主键,若没有指定主键,则会自动生成一个6字节的主键(用户不可见)。
select count() from table
MYISAM只简单读取保存好的行数。MYISAM内置了一个计数器,count()时它直接从计数器中读。
InnoDB不保存表的具体行数,需要扫描整个表来计算有多少行
索引失效:
1,负向查询条件:NOT、!=、<>、!<、NOT IN、NOT LIKE等,会导致全表扫描
2,%开头的模糊查询,会导致全表扫描
3,字段类型隐式转换可能会导致全表扫描
4,能用IN的就不要用OR查询,OR查询不一定能命中索引
5,联合索引,最左前缀匹配原则;mysql会一直向右匹配直到遇到范围查询就停止匹配,范围查询会导致组合索引半生效;比如 a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,c 可以用到索引,d 是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d 的顺序可以任意调整。