MySQL引擎
MySQL提供多种存储引擎,通过命令 show engines; 查看
查看当前默认的存储引擎 show variables like '%storage_engine%';
查看某个表用了什么引擎 show create table 表名;
MyISAM引擎:
没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT或UPDATE数据时即写操作需要锁定整个表。存储了表的行数,SELECT COUNT(*) FROM TABLE时,只需要直接读取已经保存好的值而不需要进行全表扫描,如果表的读操作远远多于写操作且不需要事务支持,那么MyISAM是个好选择。
InnoDB引擎:
InnoDB是MySQL默认的引擎,提供对ACID事务的支持,并且实现SQL标准的四种隔离级别,提供行级锁和外键约束,它的设计目的是处理大容量数据库系统,在运行时,Innodb会在内存建立缓冲池,用于缓冲数据和索引。没有保存表的行数,当SELECT COUNT(*) FROM TABLE时,需要扫描全表。使用行级锁不是一定的,如果一个SQL语句不能确定要扫描的范围,InnoDB表同样会锁全表。
MyISAM引擎索引实现
B+树作为索引结构,叶节点的data域存放的是数据记录的地址。
主键索引原理图:
辅助索引:
InnoDB引擎索引实现
同样使用B+树作为索引结构。MyISAM索引文件和数据是分离的,索引文件仅保存数据记录的地址,而在InnoDB中,表数据文件本身就是按照B+树组织的一个索引结构,叶节点data域保存完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
主键索引:
辅助索引:
InnoDB索引和MyISAM索引的区别:
1.主索引的区别,InnoDB的数据文件本身就是索引文件,而MyISAM的索引和数据是分开的。
2.辅助索引的区别,InnoDB的辅助索引data域存储相应记录主键的值而不是地址,而MyISAM的辅助索引与主索引没有多大的区别。