我正在优化一个数据库,我注意到我的varchar(255(类型列的大小非常大,这会产生磁盘空间,其中我的值不会超过30个字符。
ALTER TABLE tablename MODIFY COLUMN columnname VARCHAR(30);
我更改了列的大小,但以mb为单位的总数没有减少(以前是35.mb,现在保持不变(,我该怎么办?
我如何减少存储空间,或者这种更改将仅用于将来的插入?
SELECT table_name AS `Table`, round(((data_length + index_length) / 1024 / 1024), 2) size_mb
FROM information_schema.TABLES
WHERE table_schema = "db"
ORDER BY size_mb desc;
否,更改varchar列的声明长度并不会真正改变所需的存储量。
varchar值的长度描述为:
与CHAR不同,VARCHAR值存储为1字节或2字节长度的前缀加数据。长度前缀表示值中的字节数。如果值要求不超过255个字节,则列使用一个长度字节;如果值可能要求超过255个字符,则使用两个长度字节。
换句话说,更改varchar()
值的声明长度只能更改数据的大小,您将值从255上的更改为2255下的。你没有那样做。
如果值被截断,将节省空间。然而,MySQL确实允许这样做;它会返回一个错误(请参阅此处的示例(。
你将不得不寻找其他地方来节省空间。注意,35Mb对于数据库表来说并不是特别大。
您的更改实际上可能会加速一些查询。
在复杂的SELECT
中,可能需要构造一个临时表。这个临时表是可以保存在RAM中还是需要在磁盘上实例化取决于几个因素。其中一个因素是每个CCD_ 3的最大大小。
另外请注意,您的255(现在是30(是字符,而不是字节。需要2字节前缀取决于字节。因此,如果使用utf8,255会强制使用2字节前缀,但30不会。