Innodb是事务性引擎,它被设计用于处理大量的短期事务,短期事务大部分是正常提交,很少有回滚的情况。
Innodb将数据和索引放在单独的文件中。
Innodb的数据存储在表空间中。
Innodb采用MVCC来支持高并发,并且实现了四个标准的隔离级别
默认隔离级别为repeatable read可重复读,通过间隙锁(next-key lock)策略防止幻读的出现
间隙锁使得Innodb不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻读行的插入。
Innodb表是使用聚簇索引建立的;
聚簇索引对主键查询有很高的性能
不过二级索引(非主键索引)中必须包含主键列,所以如果主键列很大的话,其他的所有索引都很大。因此如果表中索引较多的话,主键应该尽可能小。
Innodb内存做了优化,包括从磁盘读取数据时采用的可预测性读取,能够自动在内存中创建hash索引以加速读操作的自适应哈希索引,以及能够加快插入操作的插入缓冲区等。
1、最大与最小值
一个表最多可以包含1017列
一个表最多可包含64个二级索引
多列索引最多允许16列
默认页面大小InnoDB为16KB
最大表空间大小也是表的最大大小。
表14.6 InnoDB最大表空间大小
2、Innodb表的限制
SHOW TABLE STATUS
InnoDB 除了表格保留的物理尺寸外,没有给出表格的准确统计数据。行计数只是SQL优化中使用的粗略估计
InnoDB不保留表中的内部行数,因为并发事务可能同时 “ 看到 ”不同数量的行。因此,SELECT COUNT(*) 语句只计算当前事务可见的行。
count(列):返回语句检索的行中非NULL 值数的计数。
COUNT(*)有点不同,它返回检索的行数的计数,无论它们是否包含 NULL值。
InnoDB存储精确的行数是有问题的。多个交易可能同时发生,每个交易都可能影响计数。
InnoDB不保留表中的内部行数,因为并发事务可能同时 “ 看到 ”不同数量的行。因此,SELECT COUNT(*) 语句只计算当前事务可见的行。
InnoDB 以相同的方式处理SELECT COUNT(*)和SELECT COUNT(1)操作。没有性能差异
当AUTO_INCREMENT整数列用完值时,后续INSERT 操作将返回重复键错误
DELETE FROM tbl_name 不会重新生成表,而是逐个删除所有行
3、锁定与事务
如果innodb_table_locks=1(默认),锁表时需要获得两个锁。
除了在Mysql层上的表锁外,它也获得Innodb表锁。
Innodb事务提交或者终止时,将释放事务持有的所有锁。
在autocommit=1模式下调用InnoDB表上的锁表没有多大意义,因为获得的InnoDB表锁将立即释放。
您无法在事务中锁定其他表,因为LOCK TABLES执行隐式 COMMIT和 UNLOCK TABLES。
4、Innodb冗余行特定
每个索引记录包含一个6字节的头。头用于将连续记录链接在一起,也用于行级锁定。
聚簇索引中的记录包含所有用户定义列的字段。此外,还有一个6字节的事务ID字段和一个7字节的滚动指针字段。
如果没有为表定义主键,则每个聚簇索引记录还包含一个6字节的行ID字段。
每个辅助索引记录还包含为聚簇索引键定义的所有主键字段,这些字段不在辅助索引中。
在内部,InnoDB存储固定长度的字符列,例如 CHAR(10)固定长度格式。InnoDB不会截断VARCHAR列的尾随空格 。