mysql 深入 细节记录

it2023-07-27  73

mysql 区 mysql 区是由连续页组成的空间,在任何情况下每个区的大小都是1MB。为了保证区中页的连续性,INNODB存储引擎一次从磁盘申请4 - 5 个区。在默认情况下,INNODB存储引擎页的大小为16KB,即一个区一共有64个连续的页。

mysql 页 页是INNODB磁盘管理的最小单位,在InnoDB存储引擎中,默认每个页的大小为16KB。通过innodb_page_size参数可以查询。

mysql 行 mysql 数据库的一行所有列的字段长度和不能超过65535字节。也就是每行长度不得超过64K。不包括TEXT和BLOB类型的字段

show variables like 'innodb_page_size';

字段长度 mysql 建表提示错误

ERROR 1074 (42000): Column length too big for column ‘Flist’ (max = 21845); use BLOB or TEXT instead

CREATE TABLE `field_type` ( `id` int(11) NOT NULL AUTO_INCREMENT, `col1` varchar(200) NOT NULL DEFAULT '' COMMENT '字段1', `col2` varchar(300) NOT NULL DEFAULT '' COMMENT '字段2', `col3` varchar(1000) NOT NULL DEFAULT '' COMMENT '字段3', `col4` varchar(65535) NOT NULL DEFAULT '' COMMENT '字段4', `text` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

从上面的报错我们知道Flist列指定值不能大于21845 字节(mysql官方手册中定义,创建表的字段长度限制为65535 bytes,这个是指所有列指定的长度和,当然不包括TEXT和BLOB类型的字段)。 还有一点我们需要注意的是我们定义列长度时指定的长度单位为字符,上面提到的65535限制的单位为字节。不同字符集下每个字符占用的字节数不同,utf8下每个字符占用3个字节(65535/3=21845),gbk下每个字符占用2个字节(65535/2=32767),latin1字符集下一个字符占用一个字节。

Cardinality Cardinality表示索引中不重复数量的预估值,Cardinality / 表数据总条目的结果应尽可能的接近1。如果非常小,该索引可能没有存在的意义

Mysql delete 删除表数据后空间没释放

使用delete删除的时候,mysql并没有把数据文件删除,而是将数据文件的标识位删除,没有整理文件,因此不会彻底释放空间。被删除的数据将会被保存在一个链接清单中,当有新数据写入的时候,mysql会利用这些已删除的空间再写入。即,删除操作会带来一些数据碎片,正是这些碎片在占用硬盘空间。

官方推荐使用 OPTIMIZE TABLE命令来优化表,该命令会重新利用未使用的空间,并整理数据文件的碎片。

optimize table `your_table_name`

optimize执行时会将表锁住,所以不要在高峰期使用。谨慎使用

参考书籍:

MySQL技术内幕 InnoDB存储引擎

最新回复(0)