我的帖子包含LONGTEXT
。我的问题是我想要检索特定帖子的部分内容(基本上是分页)
我使用以下查询:
SELECT SUBSTRING(post_content,1000,1000) FROM posts WHERE id=x
这在某种程度上是好的,但问题在于位置和长度。大多数时候,第一个单词和最后一个单词并不完整,这是有道理的。
如何从位置x检索长度为y的完整单词?
答案 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将比您描述的更好地扩展。
无论如何你都会这样做,这就是你的所作所为:
始终在每个细分中检索超过您需要的100个字符。例如,当您需要字符30000 - 35000时,请检索30000 - 35100。
检索细分后,查找数据中的第一个分词(第一个分段除外)并从该单词开始显示。
类似地,在100个额外字节中找到第一个单词中断,并显示该单词中断。
因此,您获取的数据可能是30000 - 35100,您显示的数据可能是30013 - 35048,但这可能是整个单词。