1

我对此有一个一般性的问题。很多时候我们想要在之前插入大量数据时更改字段或排序规则的数据类型。考虑这些情况:

  1. varchar排序规则从转换utf8_general_cilatin1_swedish_ci:据我所知,第一个具有多字节字符,第二个具有单字节字符。此转换是否正确操作存储的记录?这种转换是否会导致现有数据量的减少(可能减少 50%)?

  2. 转换int(10)smallint(5):数据量是否正确减少到 50%?

  3. 或者例如:int(10)to unsigned int(10)- textto varchar(1000)- varchar(20)to char(10), ...

很明显,可以采取这些措施来提高效率、减少数据量并...

考虑我有一个包含 1,000,000 条记录的表。我想知道执行此类操作是否会对存储的数据产生不良影响,或者它是否会降低将来涉及该表的插入和选择的性能。

更新:
当我谈到将 utf8 编码字符集更改为拉丁语时,我的字段的值当然是英语(很明显,如果有日语,它们就会丢失)。有了这个假设,我问的是结果表的大小和性能。

4

3 回答 3

4
  1. varchar排序规则从转换utf8_general_cilatin1_swedish_ci:据我所知,第一个具有多字节字符,第二个具有单字节字符。此转换是否正确操作存储的记录?这种转换是否会导致现有数据量的减少(可能减少 50%)?

    排序规则只是用于字符串比较的顺序——它(几乎)与用于数据存储的字符编码无关。我说几乎是因为排序规则只能用于某些字符集,所以更改排序规则可能会强制更改字符编码。

    在修改字符编码的范围内,MySQL 将正确地将值重新编码为新字符集,无论是从单字节到多字节还是反之亦然。请注意,对于该列来说太大的任何值都将被截断。

    如果新的字符类型是可变长度的,并且新编码中的值使用比以前更少的字节进行编码,那么表的大小当然会减少。

  2. 转换int(10)smallint(5):数据量是否正确减少到 50%?

    INT无论显示宽度如何,SMALLINT分别占用 4 和 2 个字节:所以是的,表格的大小会相应减小。

  3. 或者例如:int(10)to unsigned int(10)- textto varchar(1000)- varchar(20)to char(10), ...

    • INT不管有没有带符号都占用4个字节,所以不会有变化;

    • TEXT并且VARCHAR(1000)都占用L +2 个字节(其中L是值的字节长度),所以不会有任何变化;

    • VARCHAR(20)占用L +1 个字节(其中L是值的字节长度),而CHAR(10)占用 10× w个字节(其中w是字符集中最大长度字符所需的字节数),所以很可能会有变化,但是它取决于存储的实际值和使用的字符编码。

请注意,根据存储引擎,表大小的减少可能不会立即释放到文件系统。

于 2012-12-19T10:34:01.973 回答
1

A1。排序规则不会更改您的数据。它会更改查询中的排序顺序,并可能更改您的索引(?)。

A2。列中数据的长度将减少,但是每个表行总是有一些开销,并且您无法更改。此外,如果您的数据不是唯一的,您将不会看到索引大小有多少减少,因为您的索引看起来像这样:33->{row1,row2,row3...},67->{row9,row0,row7}并且每个行指针都比 int 大得多。

换句话说,如果您有一个包含一百个 int 行但没有很多索引的表,并将所有这些列更改为 tinyint,您会看到显着的改进。如果它只有一列,请不要打扰。

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html http://dev.mysql.com/doc/refman/5.0/en/innodb-physical-record.html

A3。请阅读 text vs varchar。前者将数据与表行分开存储,后者将数据存储在行中。每个都有自己的含义。

ps 行和索引开销很大程度上取决于您使用的数据库引擎。通常你应该使用innodb。然而对于只读任务,例如数据挖掘,myisam 更有效。

于 2012-12-19T10:36:43.400 回答
0
  • Converting varchar collation from utf8_general_ci to latin1_swedish_ci: It can reduce table(file) size, but you can lose not latin symbols, only english words will be stored correctly.
  • Conversion of int(10) to smallint(5) - it will reduce the volume of data. Conversion of int(10) to unsigned int(10) - it won't reduce. In these cases you should care about the values, you can get an error - out of range value.
  • Conversion varchar(20) to char(10): CHARs are used for strings that always have the same length (for example - 10), if the strings are different in length, then use VARCHAR data type.
于 2012-12-19T10:44:59.707 回答