mysql5.5.8版本以前默认采用myisam存储引擎之后为innodb。存储引擎是基于表的。
mysql是单进程多线程模式运行,采用插件式表存储引擎,所以数据表都包含frm文件
mysql数据库执行步骤:客服端/服务器->通信协议 -> sql->查询缓存,存在返回,不存在->解析器解析,构建解析树->预处理器->解析树->查询优化器->查询执行计划->查询执行引擎->api接口调用相关存储引擎->数据,最后通过查询执行引擎返回结果并进入查询缓存中
innodb1.2.x增加了全文索引支持、一张表可以同时存在多个current_timestamp字段
innodb特点:线程主要包括:master(合并插入缓冲,日志缓冲刷新到磁盘,合并脏页到磁盘) thread I/O thread purge thread(用来回收undo页) page cleaner thread (用来刷新脏页)
缓冲:重做日志缓存(redo log_buffer) 额外内存池 innodb_buffer_bool(数据页、索引页、插入缓冲、自适应哈希、锁信息、数据字典信息)
innodb内存缓冲采用lru算法,并且新读取的页插入到尾端37%的位置(可以参数控制)防止被某些sql刷新缓冲池,从而影响缓冲池效率
关键特性:插入缓冲(索引是辅助索引、索引不是唯一的)、两次写、自适应哈希、异步io、刷新临接页
mysql的binlog:1、statement记录的是逻辑sql语句 2、row记录表的行更改情况 3、mixed默认采用1格式有些情况会使用row格式
innodb的主键机制:每个表都会有主键 首先判断是否有唯一索引(找到其中的第一个作为主键)没有则自动创建一个6字节大小的指针
innodb char:0-255 表示字符长度,在多字符集条件下也是变长 varchar:0-65535 数据太多时采用blob存储
innodb索引:主键是聚集性索引,辅助索引远小于主键索引,选择辅助索引可以减少io次数 hash索引主要用于对缓冲池中的页进行hash并且采用链接解决冲突
innode锁:一致性非锁定读指innodb通过mvcc的方式,在读操作时会读取一个快照数据(通过undo实现)read commited在一个事务下总是读取最新的记录产生幻读现象 而repeatable read总是读取事务开始时的行数据避免幻读实现隔离性 innodb有3中锁算法:record lock单行锁 gap lock间隙锁 next-key lock包括 gap lock+record lock
innodb事务的实现:undo用来保证事务的一致性、隔离性 redo用来实现事务的原子性和持久性
myiasm与innodb的区别:个人小总结:1、结构上区别 2、事务处理 3、表的具体行数 4、锁
MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索,但不是事务安全的,而且不支持外键。每张MyISAM表存放在三个文件中:frm 文件存放表格定义;数据文件是MYD (MYData);索引文件是MYI (MYIndex)。
InnoDB是事务型引擎,支持回滚、崩溃恢复能力、多版本并发控制、ACID事务,支持行级锁定(InnoDB表的行锁不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,如like操作时的SQL语句),以及提供与Oracle类型一致的不加锁读取方式。InnoDB存储它的表和索引在一个表空间中,表空间可以包含数个文件。
主要区别:
- MyISAM是非事务安全型的,而InnoDB是事务安全型的。
- MyISAM锁的粒度是表级,而InnoDB支持行级锁定。
- MyISAM支持全文类型索引,而InnoDB不支持全文索引。(mysql5.6以前)
- MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
- MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。
- InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。
应用场景:
- MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
- InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。