2

我有包含LONGTEXT. 我的问题是我想检索特定帖子的部分内容(基本上是分页)

我使用以下查询:

SELECT SUBSTRING(post_content,1000,1000) FROM posts WHERE id=x

这在某种程度上很好,但问题在于位置和长度。大多数时候,第一个词和最后一个词是不完整的,这是有道理的。

如何从位置 x 检索长度为 y 的完整单词?

4

1 回答 1

0

大概您这样做是为了节省 MySQL 服务器和运行应用程序的机器之间的网络流量开销。碰巧的是,您不会在 MySQL 服务器上节省任何其他类型的工作负载。它必须从磁盘中获取 LONGTEXT 项目,然后通过SUBSTRING.

大概您已经根据可靠的性能分析决定必须保存此网络流量。既然您知道它不会节省太多 MySQL 服务器工作量,您可能想重新审视这个分析。您的节省将是微不足道的,除非您有数以万计的很长的 LONGTEXT 项目和大量的流量来检索和显示其中的一部分。

换句话说,这是一个优化任务。雅格尼? http://en.wikipedia.org/wiki/YAGNI

如果您确实需要它,您将不得不创建软件来逐字处理 LONGTEXT 项目。您最好的选择是在您的客户端软件中执行此操作。首先检索文章的第一页和一两篇文章。然后,解析文本以查找完整的单词。在第一页中找到最后一个完整的单词及其后面的空格后,该字符位置就是下一页的起始位置。

这种任务在 MySQL 存储过程中是一个巨大的痛苦。另外,当您在存储过程中执行此操作时,您将在共享且难以扩展的资源(MySQL 服务器机器)上使用处理周期,而不是在可克隆的客户端机器上使用。

我知道我没有给你干净的代码来做你要求的事情。但是按照你的建议去做显然不是一个好主意。

编辑

观察:1 GB 的服务器 RAM 大约需要 20 美元。像 memcached 这样的缓存系统在有效利用价值 100 美元的内存方面做得很好。这对于您描述的用例来说已经足够了。

另一个观察结果:许多提供大型文档的公司使用文件系统而不是 DBMS 来存储它们。文件系统可以很容易地在内容服务器之间共享或复制,并且文件可以很容易地随机访问而没有任何开销。

将整本书存储在单个 BLOB 或 CLOB 中有点创新。如果您可以按某种细分(页面)来拆分书籍?章节?千字块?- 并为每个段创建单独的数据行,您的 DBMS 将比您描述的要好得多。

如果你还是要这样做,这就是你要做的:

  1. 总是在每个段中检索比您需要的多 100 个字符。例如,当您需要字符 30000 - 35000 时,检索 30000 - 35100。

  2. 检索段后,查找数据中的第一个分词(第一个段除外)并从该词开始显示。

  3. 同样,在 100 个额外字节中找到第一个分词,并显示到该分词。

因此,您获取的数据可能是 30000 - 35100,而您显示的数据可能是 30013 - 35048,但它会是整个单词。

于 2012-09-22T12:15:33.043 回答