如果你在同一个表中有一个VARCHAR,那么使用CHAR有什么意义吗?

时间:2011-02-08 20:55:01

标签: mysql performance char varchar

我刚刚阅读了this question的接受答案,这给我留下了这个问题。

以下是该答案的引用:

“但是既然你用MySQL标记了这个问题,我会提到一个特定于MySQL的提示:当你的查询隐式生成一个临时表时,例如在排序或GROUP BY时,VARCHAR字段是转换为CHAR以获得使用固定宽度行的优势。如果您使用大量VARCHAR(255)字段用于不需要那么长的数据,这可以使临时表非常大“。

据我所知,CHAR的优势在于你获得了固定宽度的行,所以同一个表中的VARCHAR不会混乱吗?如果在同一个表中有CHAR,使用VARCHAR会有什么好处吗?


以下是一个例子:

CHAR

CREATE TABLE address (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    street VARCHAR(100) NOT NULL,
    postcode CHAR(8) NOT NULL,
    PRIMARY KEY (id)
);

没有CHAR的表:

CREATE TABLE address (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    street VARCHAR(100) NOT NULL,
    postcode VARCHAR(8) NOT NULL,
    PRIMARY KEY (id)
);

CHAR的表格是否会比没有CHAR的表格更好,如果是,那么在什么情况下呢?

1 个答案:

答案 0 :(得分:2)

VARCHAR”基本上设置字段的最大长度,并仅存储输入的数据,从而节省空间。 “CHAR”类型具有固定长度,因此如果设置“CHAR(100)”,则无论内容是什么,都将使用100个字符的空间。

您获得速度优势的唯一时间是您的记录中没有可变长度字段(“VARCHAR”,“TEXT”等)。 您可能会注意到在MySQL内部,一旦添加了可变长度字段类型,您的所有“CHAR”字段都会更改为“VARCHAR”。

从空间存储的角度来看,“CHAR”的效率也较低,但搜索和添加效率更高。它更快,因为数据库只需要读取偏移值来获取记录而不是读取部分,直到找到记录的结尾。固定长度记录将最小化碎片,因为已删除的记录空间可以重新用于新记录。

希望它有所帮助。