增加TEXT性能?

时间:2014-02-01 18:19:47

标签: mysql database

我需要将文本存储在MySQL数据库中。每行的文字大小不同,通常约为10kb,但在极少数情况下可为100kb

对于读取和写入,将经常访问该文本。出于这个原因,我认为最好使它VARCHAR,因为它比TEXT快得多。

问题:是否可以创建列VARCHAR,并且在极少数情况下文本超过64kb,以某种方式将其存储为TEXT

3 个答案:

答案 0 :(得分:5)

您可以声明的最大VARCHAR是64KB。 TEXT列的最大长度为64KB。

请参阅http://dev.mysql.com/doc/refman/5.6/en/string-type-overview.html

如果您需要更长的字符串,则应使用MEDIUMTEXT。此数据类型最多可存储16MB。

你在哪里知道VARCHAR“比TEXT快得多?”在InnoDB存储引擎中,VARCHAR,TEXT和BLOB以相同的方式存储。

我阅读了链接到的论坛文章,我的反应是:

尝试为PRIMARY或UNIQUE字段使用前缀索引会产生一些意想不到的后果,例如无法正确执行唯一性:

mysql> create table foo (t text, primary key(t(50)));
mysql> insert into foo values (concat(repeat('a',50), 'x'));
mysql> insert into foo values (concat(repeat('a',50), 'y'));
ERROR 1062 (23000): Duplicate entry
  'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaay' for key 'PRIMARY'
  

好的,我想我会使用2列,一个VARCHAR和一个MEDIUMTEXT,让我的程序尽可能使用VARCHAR。这会浪费每行3个字节,我需要一直读取VARCHAR以查看是否为空。这是个好主意吗?

我不会这样做。当您必须检查数据所在的列时,它会使您的应用程序变得复杂。通过您需要执行的额外编码工作,您可能会因将字符串存储在一个列类型或另一个列中而获得的任何微不足道的优势,以及潜在的错误将介绍。

答案 1 :(得分:2)

SQL是强类型的,因此没有动态类型切换。您可以使用LONGTEXT列并在列的前x个字符上创建索引。这应该为您提供所需的查询性能,同时允许您存储大值。

CREATE INDEX ltcol_idx ON my_table (ltcol(64));

答案 2 :(得分:2)

我曾经将文本存储为blob,它可以在InnoDB引擎中保存~64k的UTF-8文本符号。

相关问题