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';快一点
并没有指定页的大小
使用了文件系统层面的压缩