day021InnoDB_2 SpaceID.PageNumber 压缩表)

1 表空间

1.1General 表空间

CREATE TABLESPACE tablespace_name

    ADD DATAFILE 'file_name'

    [FILE_BLOCK_SIZE = value]

        [ENGINE [=] engine_name]

CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;

CREATE TABLESPACE `ts1` ADD DATAFILE '/my/tablespace/directory/ts1.ibd' Engine=InnoDB;

CREATE TABLESPACE `ts1` ADD DATAFILE '../my_tablespace/ts1.ibd' Engine=InnoDB;

CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPACT;

ALTER TABLE t2 TABLESPACE ts1;

如果row_format是compressed,file_block_size必须被指定,key_block_size被指定和file_block_size一样

查看系统表空间

select * from innodb_sys_tablespaces;

select * from INNODB_SYS_TABLES;

这两个有什么区别?

1.2 undo表空间

innodb_undo_tablespaces设置

SELECT @@innodb_undo_tablespaces;

SET GLOBAL innodb_undo_log_truncate=ON;

SET GLOBAL innodb_max_undo_log_size=2147483648;

SELECT @@innodb_undo_directory;

SELECT @@innodb_purge_rseg_truncate_frequency;

2

重做日志(redo)物理逻辑日志,没有oracle的归档重做日志

innodb_log_file_size=1G

防止脏页刷新被hang住

表空间的内部组织结构

段->区->页

区:最小的空间申请单位

区的固定1M(每1m都是连续的)

16k 64个页

8k 128个页

4k 256个页

通常一次申请4个区的大小

inno_page_size默认16k(5.6可设置)

页:最小的io操作单位

innodb中怎么样定义一个页的(space,page_no)

每个space对应一个文件

pagenum在表空间 他是第几个16k的页

二进制文件是按偏移量读取字节数

select space,table_id from innodb_sys_tables where space <>0 limit 1;

space和table是怎么对应的?

fread(offset,bytes)不关两个页在物理上是否连续

space_id是自增的,表删除之后不会回收

怎么样才能释放空间

page_no是全局自增

如果ibdata文件没了怎么办

extent是逻辑概念

区和段都是逻辑概念

fread(page_no*16384,1384)

能从数据库查某个表的space和页是哪个吗?

一个页的数据会跨表吗?(可以跨表)

ssd设置page_no为8k

mysql oltp场景

数据仓库 大量join 设置大一点

inno_page_size全局

innodb_sys_tablespaces

create tablespace t5 add datafile '' file_block_size=1096;

create table aa()tablespace=t5;

压缩表可以tablespace的什么大小与page-size不一致

create table gg()row_format=compressed,key_block_size=4

alter table t row_format=compressed,key_block_size=4;

compressed不是对记录进程压缩,而是对一个页进程压缩

不解压能插入

插入的redo log放进去 满了 解压 再压缩

information_schema innodb_cmp

innodb_cmp_reset

innodb_cmp_per_index

select table_schema,table_name from information_shcema.tables

where table_name not in(select distinct talbe_name from information_schema

where column_key='PRI')and table_schema not in ('mysql','information_shcema','sys','performation_shcema');

了解information_schema的tables和columns表

ssd盘可以设置4k或者8k

不可以将非压缩表设置和innodb_page_size不同

select * from innodb_cmp_per_index limit 1\G

innodb_cmp_per_index_enabled=on(打开对性能有一定的影响)

alter table xxxx engine=innodb row_format=compressed,key_block_size=16是否有意义?

页已经压缩过了,再对内容压缩 key_block_size开启基于页的压缩

并不是页设置的越小压缩率就越小

iostat查看io bond

master和slave不一定都压缩

key_block_size一般设置为innodb_page_size的一半

mysql5.7新的压缩

透明表空间压缩transparent page compress

create table jjj()compression='zlib';

alter table jjj compression='lz4';快一点

并没有指定页的大小

使用了文件系统层面的压缩

原文地址:https://www.cnblogs.com/lvjinping/p/9167704.html