MySQL LONGTEXT分页

时间:2012-09-22 11:15:21

标签: mysql pagination longtext

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

我使用以下查询:

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

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

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

1 个答案:

答案 0 :(得分:0)

据推测,您这样做是为了节省MySQL服务器和运行应用程序的计算机之间的网络流量开销。碰巧的是,您没有在MySQL服务器上保存任何其他类型的工作负载。它必须从磁盘获取LONGTEXT项,然后通过SUBSTRING运行它。

据推测,您已经基于可靠的性能分析决定必须保存此网络流量。您可能希望重新访问此分析,因为您知道它不会节省太多MySQL服务器工作负载。除非你拥有数以万计的非常长的LONGTEXT项目和大量的流量来检索和显示部分内容,否则你的储蓄将是微不足道的。

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

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

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

我知道我没有给你干净的代码来做你所要求的。但是,按照你的建议行事并不是一个好主意。

修改

观察:一千兆字节的服务器RAM大约花费20美元。像memcached这样的缓存系统可以很好地有效地利用价值100美元的内存。这对你所描述的用例来说已经足够了。

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

将整本书存放在单个BLOB或CLOB中有点创新。如果你可以通过某种细分 - 页面分解书籍?章节?千字块? - 并为每个段创建单独的数据行,您的DBMS将比您描述的更好地扩展。

无论如何你都会这样做,这就是你的所作所为:

  1. 始终在每个细分中检索超过您需要的100个字符。例如,当您需要字符30000 - 35000时,请检索30000 - 35100。

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

  3. 类似地,在100个额外字节中找到第一个单词中断,并显示该单词中断。

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