我有包含LONGTEXT
的表格帖子。我的问题是,我想检索特定帖子的一部分(基本上是分页)。
我使用以下查询:
SELECT SUBSTRING(post_content,1000,1000) FROM posts WHERE id=x
这在某种程度上是好的,但问题是位置和长度。大多数时候,第一个单词和最后一个单词是不完整的,这是有意义的。
如何从位置x检索长度为y的完整单词?
发布于 2012-09-22 12:15:33
您这样做的目的可能是为了节省MySQL服务器和运行应用程序的机器之间的网络流量开销。实际上,您并没有在MySQL服务器上保存任何其他类型的工作负载。它必须从磁盘获取LONGTEXT项,然后通过SUBSTRING
运行它。
根据可靠的性能分析,您可能已经决定必须保存此网络流量。既然您知道这个分析并不能节省太多的MySQL服务器工作负载,那么您可能想要重新审视它。你的节省将是微不足道的,除非你有无数的非常长的LONGTEXT项目和大量的流量来检索和显示它们的一部分。
换句话说,这是一个优化任务。YAGNI?http://en.wikipedia.org/wiki/YAGNI
如果您确实需要它,您将不得不创建软件来逐字处理LONGTEXT项。你最好的办法就是在你的客户端软件中做到这一点。从检索第一页开始,加上文章的k或两个部分。然后,解析文本以查找完整的单词。在第一页中找到最后一个完整的单词及其后面的空格之后,该字符位置就是下一页的开始位置。
在MySQL存储过程中,这类任务是一个巨大的难题。此外,当您在存储过程中执行此操作时,将在共享且难以扩展的资源( MySQL服务器计算机)上使用处理周期,而不是在可克隆的客户端计算机上使用处理周期。
我知道我没有给你干净的代码让你按你说的做。但这显然不是一个好主意去做你所建议的。
编辑:
一个观察结果是:1 of的服务器内存大约需要USD20。像memcached这样的缓存系统在有效利用USD100价值的内存方面做得很好。对于您所描述的用例来说,这已经足够了。
另一个观察结果是:许多为大型文档提供服务的公司使用文件系统而不是DBMS来存储这些文档。文件系统可以很容易地在内容服务器之间共享或复制,并且文件可以被随机访问,而不需要任何开销。
将整本书存储在单个BLOB或CLOB中有点创新。如果你能把书分成几个部分--页面?章节?千字块?--并为每个段创建单独的数据行,您的DBMS将比您所描述的更好地扩展。
如果你无论如何都要这么做,下面就是你要做的:
因此,您获取的数据可能是30000 - 35100,显示的数据可能是30013 - 35048,但它可能是完整的单词。
https://stackoverflow.com/questions/12543247
复制