MySQL 8新特性--InnoDB相关新特性

文章目录

      • 6.1. auto-increment
      • 6.2.innodb_deadlock_detect
      • 6.3. INFORMATION_SCHEMA.INNODB_CACHED_INDEXES
      • 6.4. 临时表
      • 6.5. SELECT ... FOR SHARE 和SELECT ... FOR UPDATE语句支持NOWAIT、SKIP LOCKED
      • 6.6. 本地分区API支持ALTER TABLE…ADD PARTITION, DROP PARTITION, COALESCE PARTITION, REORGANIZE PARTITION,和REBUILD PARTITION,也可以与ALGORITHM={COPY|INPLACE}和LOCK一起使用.
      • 6.7. 8.0版本开始mysql系统表和数据字典表是在MySQL数据目录中的一个名为mysql.ibd的InnoDB表空间文件中创建。 以前,这些表是在mysql数据库目录中的单个InnoDB表空间文件中创建的。
      • 6.8. UNDO表空间的新特性
        • 6.8.1. undo表空间的数量可以通过变量innodb_undo_tablespaces动态修改
        • 6.8.2. innodb_undo_log_truncate默认启用
        • 6.8.3. innodb_undo_tablespaces默认值从0变为了2
        • 6.8.4. undo表空间文件命名
        • 6.8.5. innodb_rollback_segments
        • 6.8.6. innodb_undo_logs移除,由innodb_rollback_segments代替
      • 6.9. 影响缓冲池预刷新和刷新行为的配置的默认值已变化
      • 6.10. 重命名表空间
      • 6.11. 新innodb_dedicated_server
      • 6.12. INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF
      • 6.13. MySQL自带的zlib library版本从1.2.3升级到1.2.11
      • 6.14. redo新特性
      • 6.15. 在8.0.12版本中ALTER TABLE支持ALGORITHM=INSTANT
      • 6.16. MySQL 8.0.13支持普通表空间的加密
      • 6.17. innodb_buffer_pool_in_core_file
      • 6.18. MySQL 8.0.14, InnoDB 支持并行索引读
      • 6.19. CREATE TABLESPACE中ADD DATAFILE字句是可选了

6.1. auto-increment

每次值更改时,当前最大自动增量计数器值将写入重做日志,并保存到每个检查点上的引擎专用系统表中。 这些更改使当前最大自动增量计数器值在服务器重新启动时保持不变。 另外:

  • 服务器重新启动不再取消表指定的AUTO_INCREMENT值。 如果将自动递增计数器初始化为特定值,或者将自动递增计数器值更改为更大的值,则新的值将在服务器重新启动时保持不变。
  • 在ROLLBACK操作之后立即重新启动服务器不再导致重用已分配给回滚事务的自动增量值。
  • 如果将AUTO_INCREMENT列值修改为大于当前最大自动增量值的值(例如,在UPDATE操作中),则新值将保持不变,并且后续INSERT操作将从新的值开始分配自动增量值。
    更多信息请查看:

https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html
https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html#innodb-auto-increment-initialization

6.2.innodb_deadlock_detect

很奇怪在8.0文档中提到,这是一个新的支持动态修改的系统变量。但是这个参数在5.7中就已经支持动态修改了,连官方文档关于该变量的说明都是一样的,有点尴尬。实际上是在5.7.15就引入该变量了。
该参数用来禁用死锁的检测的,因为在高峰期的数据库中检测死锁是非常昂贵操作。所以在系统非常繁忙的时候,可以暂时关闭死锁检测。
注:要配合innodb_lock_wait_timeout变量使用,用来控制事务获取某个资源可等待时间,默认50S,超过该时间会返回错误信息: ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

6.3. INFORMATION_SCHEMA.INNODB_CACHED_INDEXES

新引入的表,用来查看每个索引在InnoDB缓冲池中缓存的索引页数。

改表只有三列:

  • SPACE_ID:表空间ID

  • INDEX_ID:索引的唯一标识符

  • N_CACHED_PAGES: InnoDB缓冲池中缓存的索引页数
    如:

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_CACHED_INDEXES WHERE INDEX_ID=65/G
    *************************** 1. row ***************************
    SPACE_ID: 4294967294
    INDEX_ID: 65
    N_CACHED_PAGES: 45

可以结合INNODB_INDEXES 和INNODB_TABLES表来查看具体的表名和索引名,如:

SELECT
  tables.NAME AS table_name,
  indexes.NAME AS index_name,
  cached.N_CACHED_PAGES AS n_cached_pages
FROM
  INFORMATION_SCHEMA.INNODB_CACHED_INDEXES AS cached,
  INFORMATION_SCHEMA.INNODB_INDEXES AS indexes,
  INFORMATION_SCHEMA.INNODB_TABLES AS tables
WHERE
  cached.INDEX_ID = indexes.INDEX_ID
  AND indexes.TABLE_ID = tables.TABLE_ID;

6.4. 临时表

InnoDB的临时表现在将在共享临时表空间中创建,ibtmp1。

6.5. SELECT … FOR SHARE 和SELECT … FOR UPDATE语句支持NOWAIT、SKIP LOCKED

和Oracle一样,NOWAIT就是如果访问的资源被另外一个事务锁住,那么会立即返回错误信息不会等待。SKIP LOCKED就是跳过锁住的行,返回剩余的其他行数据。
具体如下:
/# 会话1:

mysql> CREATE TABLE t (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;
mysql> INSERT INTO t (i) VALUES(1),(2),(3);
mysql> START TRANSACTION;
mysql> SELECT * FROM t WHERE i = 2 FOR UPDATE;
+---+
| i |
+---+
| 2 |
+---+

/# 会话2:

mysql> START TRANSACTION;
mysql> SELECT * FROM t WHERE i = 2 FOR UPDATE NOWAIT;
ERROR 3572 (HY000): Do not wait for lock.

/# 会话3:

mysql> START TRANSACTION;
mysql> SELECT * FROM t FOR UPDATE SKIP LOCKED;
+---+
| i |
+---+
| 1 |
| 3 |
+---+  

注:SELECT … FOR SHARE 取代了SELECT … LOCK IN SHARE MODE语句,但是后者还可以使用,是为了向后兼容,两者作用是相同的。

6.6. 本地分区API支持ALTER TABLE…ADD PARTITION, DROP PARTITION, COALESCE PARTITION, REORGANIZE PARTITION,和REBUILD PARTITION,也可以与ALGORITHM={COPY|INPLACE}和LOCK一起使用.

如:

DROP PARTITION和ALGORITHM=INPLACE一起使用,将删除分区的数据和分区.
DROP PARTITION和ALGORITHM=COPY或old_alter_table=ON一起使用,将删除分区,但是会将该分区中的数据移动到复合条件的分区中,不符合条件的数据将被删除.

6.7. 8.0版本开始mysql系统表和数据字典表是在MySQL数据目录中的一个名为mysql.ibd的InnoDB表空间文件中创建。 以前,这些表是在mysql数据库目录中的单个InnoDB表空间文件中创建的。

6.8. UNDO表空间的新特性

6.8.1. undo表空间的数量可以通过变量innodb_undo_tablespaces动态修改

6.8.2. innodb_undo_log_truncate默认启用

6.8.3. innodb_undo_tablespaces默认值从0变为了2

意味着回滚段将在两个undo表空间中创建,而不是之前在默认的InnoDB系统表空间中.另外如果想要truncate udno日志,那么innodb_undo_tablespaces最小值是2.

6.8.4. undo表空间文件命名

新的命名方式是undo_NNN,以前是undoNNN,其中NNN是undo空间号.

6.8.5. innodb_rollback_segments

innodb_rollback_segments在8.0版本中表示每个undo表空间中的回滚段数量,在此之前表示一个MySQL实例总的回滚段数量. 其中Innodb_available_undo_logs被移除.

6.8.6. innodb_undo_logs移除,由innodb_rollback_segments代替

6.9. 影响缓冲池预刷新和刷新行为的配置的默认值已变化

  • innodb_max_dirty_pages_pct_lwm现在默认值是10,之前默认值还是0,也就是不启用预刷新缓冲池.当缓冲池中的脏页超过10%就会启用预刷新,从而提升性能一致性.
  • innodb_max_dirty_pages_pct默认值从75增大到90,表示:缓冲池中的脏页比例不能超过该值,允许缓冲池更高的脏页比例.

6.10. 重命名表空间

可以通过ALTER TABLESPACE … RENAME来重命名表空间

6.11. 新innodb_dedicated_server

新的系统变量innodb_dedicated_server,默认不启用.如果启用了,则可以根据操作系统的内存大小来自动配置下面三个变量的大小:

  • innodb_buffer_pool_size
    内存大小 变量大小
    < 1G 128* MiB (the innodb_buffer_pool_size default)
    <= 4G 内存* 0.5
    > 4G 内存* 0.75

  • innodb_log_file_size
    内存大小 变量大小
    < 1G 48MiB (the innodb_log_file_size default)
    <= 4G 128MiB
    > 4G 512MiB
    <= 16GB 1024MiB
    > 16GB 2048MiB

  • innodb_flush_method
    windows默认值 unbuffered
    unix默认值 fsync
    windows支持的值 unbuffered
    normal
    unix支持的值 fsync
    O_DSYNC
    littlesync
    nosync
    O_DIRECT
    O_DIRECT_NO_FSYNC

当启用了innodb_dedicated_server, innodb_flush_method将设置为O_DIRECT_NO_FSYNC.如果O_DIRECT_NO_FSYNC设置不可用,将使用innodb_flush_method默认值.
注:Linux系统不要使用O_DIRECT_NO_FSYNC,如果数据文件大小变化将会造成操作系统HUNG.

6.12. INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF

用于查看innodb表空间的相关信息,name,path,flag,space type等.

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF WHERE SPACE = 7;
+-------+---------+---------------+-------+------------+
| SPACE | NAME    | PATH          | FLAG  | SPACE_TYPE |
+-------+---------+---------------+-------+------------+
| 7     | test/t1 | ./test/t1.ibd | 16417 | Single     |
+-------+---------+---------------+-------+------------+
  • SPACE:表空间ID
  • NAME:表空间名称.对于一个表一个表空间来说,名称就是schema/table_name
  • PATH:数据文件路径.如果数据文件不再MySQL数据文件目录下,那么会显示绝对路径,否则显示相对路径.
  • FLAG: A numeric value that represents bit-level information about tablespace format and storage characteristics.
  • SPACE_TYPE:表空间类型
    General表示Innodb普通表空间
    Single表示一个表一个表空间
    System表空间Innodb系统表空间

6.13. MySQL自带的zlib library版本从1.2.3升级到1.2.11

6.14. redo新特性

  • User threads can now write concurrently to the log buffer without synchronizing writes.
  • User threads can now add dirty pages to the flush list in a relaxed order.
  • A dedicated log thread is now responsible for writing the log buffer to the system buffers, flushing system buffers to disk, notifying user threads about written and flushed redo, maintaining the lag required for the relaxed flush list order, and write checkpoints.
  • innodb_log_buffer_size动态修改

6.15. 在8.0.12版本中ALTER TABLE支持ALGORITHM=INSTANT

6.16. MySQL 8.0.13支持普通表空间的加密

INFORMATION_SCHEMA.INNODB_TABLESPACES中ENCRYPTION列表示该表空间是否加密

6.17. innodb_buffer_pool_in_core_file

在8.0.14版本中新增了参数innodb_buffer_pool_in_core_file可以动态修改,默认是启用.可以禁用来禁止缓冲池页被写入到核心文件中,从而减少核心文件的大小.

6.18. MySQL 8.0.14, InnoDB 支持并行索引读

innodb_parallel_read_threads必须设置为1以上 默认值是4

6.19. CREATE TABLESPACE中ADD DATAFILE字句是可选了

你可能感兴趣的:(MySQL,8)