我是否应该使用另一列来显示 LONGTEXT 是否包含数据?

Should I use another column to show whether LONGTEXT contains data?

我有一个疑问(可能是非常基本的)关于知道一个字段是否已经存储在数据库中的信息。

我正在使用 Laravel 和 MySQL 作为数据库引擎。

情况如下:

我在数据库中有一个存储信息的字段(在本例中它是一个包含大量信息的 LONGTEXT 字段)。该字段以自动方式(通过 CRON)存储信息。

在列出与table的记录相关的信息时,我需要知道相关字段是否包含信息。

起初我想在同一个 table 中包含另一个字段(列),告诉我该字段是否为空。虽然我认为这是一种正确的方法,但另一方面我认为我可以通过简单地检查相关字段是否为空来保存此列。但是,我不确定这是否是正确的方法,以及这是否会影响应用程序的性能(我不知道 MySQL 是如何进行这种比较的,或者是否可以通过利用新字段)。

希望我的解释是正确的。 示意性地,选项是:

选项 1:

选项 2:

该问题的目的是使用良好做法以及优化搜索并最大程度地减少对流程性能的影响。

非常感谢您。

MySQL 检索 LONGTEXT 或任何其他 BLOB / CLOB 列的内容需要额外的工作。即使您的查询说,您也会承担这项工作。

SELECT id FROM tbl WHERE longtext IS NOT NULL   /* slow! */

SELECT id FROM tbl WHERE CHAR_LENGTH(longtext) >= 1   /* slow! */

所以,是的,如果您需要 运行 很多这样的查询,您还应该使用另一列来指示是否填充了 LONGTEXT 列。

您可以考虑使用这样的 generated -- virtual --- colum

textlen BIGINT GENERATED ALWAYS AS (CHAR_LENGTH(longtext)) STORED

生成的列将在您插入或更新行时获得其值。那么WHERE textlen >= 1就快了。你甚至可以在上面放一个索引。

寻找长度而不是布尔值。它不会占用更多 space,它会为您提供更多信息,并且它为您提供了一种在测试期间合理检查逻辑的好方法。