将 TEXT 字段拆分为多个表是不是可以在多语言应用程序中提供性能优化?
Posted
技术标签:
【中文标题】将 TEXT 字段拆分为多个表是不是可以在多语言应用程序中提供性能优化?【英文标题】:Does splitting TEXT fields into multiple tables provide performance optimization in multi-language application?将 TEXT 字段拆分为多个表是否可以在多语言应用程序中提供性能优化? 【发布时间】:2011-12-16 14:26:18 【问题描述】:我正在构建一个项目,但我有一个关于 mysql 数据库的问题。该应用程序是多语言的。我们想知道如果我们将不同类型的文本字段(varchar、text、med-text)拆分到不同的表中,您是否会获得更好的性能?还是只用一个文本字段创建一个表格更好?
考虑到这个问题和多语言限制,我想知道将不同类型的文本字段分成单独的表是否会提高性能。因为当您只有一张包含所有文本和语言的表格时,您可以轻松搜索它。 (给我这个值(在项目列中)和那个语言的文本)当你有不同类型的文本的不同表格时。您将节省数据库中的空间。因为您不需要 varchar(200) 的全文区域,但是您将有多个表来创建项目、文本类型和文本语言之间的连接。
你认为什么是最好的?还是有一些我没有用到的可能性?
【问题讨论】:
如果没有一些您将要存储的数据的真实示例以及数据之间的关系,很难回答您的问题 - 请在您的问题中添加更多细节 【参考方案1】:出于性能原因,我发现将具有 blob
和 text
数据类型的列与其他数据类型分开保存会更好,即使它破坏了规范化。
考虑一个person
表,其中包含name varchar
、address varchar
、dob date
和picture blob
列。一张图片可以很容易地达到 1MB 左右,而其余列可能不会超过 1KB。想象一下,即使您只想列出居住在某个城市的人的姓名和地址,也需要读取多少块数据——如果您将所有内容都放在同一张表中。
【讨论】:
【参考方案2】:如果你没有绑定 MySQL,如果你想做全文搜索,我建议你使用某种文本搜索引擎,比如Apache Lucene
。因为据我所知,MySQL 在全文搜索方面的性能不如 Lucene。
如果您绑定到 MySQL,让我尝试根据问题的当前定义提供一些信息(实际上还没有太多)。
MySQL reference documentation 声明:
使用临时表处理的查询结果中的 BLOB 或 TEXT 列实例会导致服务器使用磁盘上的表而不是内存中的表,因为 MEMORY 存储引擎不支持这些数据类型。
因此,如果您在包含文本字段的表上使用 SELECT *
运行查询,您可以将真正需要文本字段的查询和不需要文本字段的查询分开以提高速度;或者,您也可以将文本字段与表格分开。在辅助表上保存文本字段会导致重复键存储以及该辅助表的索引的额外开销。但是,根据您的数据库设计,您可能还会因不必要的索引更新而承受开销,这可以通过将文本字段移动到另一个表来消除,但这只是一个提议,因为我们不知道您的架构和数据访问场合。
【讨论】:
以上是关于将 TEXT 字段拆分为多个表是不是可以在多语言应用程序中提供性能优化?的主要内容,如果未能解决你的问题,请参考以下文章
根据字段值将 Access/Excel 表拆分为多个 Excel 工作表