数据库 vs 实例
数据库指文件的结合
实例指程序, 由单进程多后台线程(共享内存区)构成的运行实例
在集群情况下, 数据库与实例可以一对多
用户通过实例, 对数据库进行操作
InnoDB存储引擎
- 事务
- 行锁
- 外键
- 读操作不加锁
- 1.2后支持全文索引
- 默认repeatable隔离级别
- 用next-key locking避免幻读
- 聚集索引, 每张表按主键顺序存放
MyISAM存储引擎
- 支持全文索引
- 只缓存索引文件, 不缓存数据文件
- 不支持事务, 行锁, 外键
NDB存储引擎
- 索引数据全部在内存(非索引数据可内存/磁盘), 主键查找快
- JOIN在数据库层完成而不是存储引擎层, JOIN很慢
Memory存储引擎
- 表数据全部在内存中, 一般用于临时表
- hash索引而不是B+树索引
- 只支持表锁
- 不支持test, blob, varchar用char实现
- 超过容量或有test/blob时会被转换为MyISAM, 查询性能下降
MySQL连接
基于TCP/IP的socket连接, 将可访问用户的IP权限记录在user表中
Windows中位于同一服务器的进程通信可以使用命名管道/共享内存
在-nux系统下还可使用unix socket, 即访问同一主机上的socket文件
InnoDB
日志
用来实现事务, 采用预写日志和redo
当开始事务时,会记录该事务的lsn(log sequence number)号;
当事务执行时,会往InnoDB存储引擎的日志的日志缓存里面插入事务日志;
当事务提交时,必须将存储引擎的日志缓冲写入磁盘(通过innodb_flush_log_at_trx_commit来控制),也就是写数据前,需要先写日志