Database 动态数据的SQL分页

Database 动态数据的SQL分页,database,pagination,Database,Pagination,我不熟悉分页,所以我不确定我是否完全理解它是如何工作的。但这是我想做的 基本上,我正在创建一个从数据库(MySQL)生成结果的搜索引擎。这些结果通过算法合并在一起,然后返回给用户 我的问题是:当结果在后端被合并时,我是否需要创建一个包含结果的临时视图,然后由PHP分页使用?还是创建一个表?我不希望每个查询都有一堆视图和/或表。另外,如果我使用临时表,它们什么时候被销毁?如果用户点击他/她的浏览器上的“后退”按钮怎么办 我希望这是有道理的。如果你不明白,请要求澄清。我在下面提供了更多的信息 更多说

我不熟悉分页,所以我不确定我是否完全理解它是如何工作的。但这是我想做的

基本上,我正在创建一个从数据库(MySQL)生成结果的搜索引擎。这些结果通过算法合并在一起,然后返回给用户

我的问题是:当结果在后端被合并时,我是否需要创建一个包含结果的临时视图,然后由PHP分页使用?还是创建一个表?我不希望每个查询都有一堆视图和/或表。另外,如果我使用临时表,它们什么时候被销毁?如果用户点击他/她的浏览器上的“后退”按钮怎么办

我希望这是有道理的。如果你不明白,请要求澄清。我在下面提供了更多的信息


更多说明:该数据库包含英语单词和短语,每个单词和短语都映射到一个概念(例如:“apple”在语义上与“cooking”的概念相关,为0.67)。用户可以输入一组关键字,并找到与这些关键字最接近的匹配概念。因此,我在数学上结合原始的关系分数,为用户输入的一组单词找到语义上最相关的概念的排序列表。因此,它不像构建“SELECT*FROM words WHERE blah blah…”这样的SQL查询那么简单。

这取决于您的数据库引擎(即什么样的SQL),但几乎每种SQL风格都支持对查询分页

例如,MySQL有,MS SQL有

因此,像往常一样构建SQL,然后只添加特定于数据库引擎的分页内容,服务器只会自动返回查询结果的第10到20行


编辑:

因此,最终的查询(选择返回给用户的数据)从一些表(临时或非临时)中选择数据,正如我所期望的那样。
这是一个
SELECT
查询,您可以在MySQL中使用
LIMIT
进行分页

在我看来,您的描述好像实际计算比最终查询更占用资源,最终查询将结果返回给用户

因此,我将做以下工作:

  • 获取输入单词的各个结果表,并将它们保存在一个表中,以便以后可以获取此特定查询的数据(例如,使用SessionID或QueryID等附加列)。这里没有分页
  • 再次查询这些结果表,以获取返回给用户的最终查询。
    在这里,您可以使用
    LIMIT
    进行分页
因此,当用户“启动”查询时,您只需执行一次实际计算(占用资源的查询)。然后,只需从已填充的结果表中进行选择,即可将分页结果返回给用户


编辑2:

我刚刚看到你接受了我的回答,但这里仍然有关于我使用“临时”表的更多细节

当然,这只是一种可能的方法。如果预期的结果不是太大,那么也可以将整个结果集返回给客户端,将其保存在内存中并执行分页客户端(如您所建议的)。
但如果我们谈论的是真正的海量数据,而用户只会查看其中的少数数据(比如谷歌搜索结果)和/或低带宽,那么您只想向客户端传输尽可能少的数据

这就是我写这个答案时的想法

所以:我不是指“真正的”临时表,我指的是用于保存临时数据的“普通”表。
我对MS SQL的熟练程度远远高于MySQL,因此我对MySQL中的临时表了解不多。
我可以告诉你我将如何在MS SQL中实现这一点,但也许在MySQL中有更好的方法实现这一点,我不知道

当我需要分页一个资源密集型查询时,我希望只进行一次实际计算,将其保存在一个表中,然后从客户端多次查询该表(以避免对每个页面再次进行计算)。
问题是:在MS SQL中,临时表只存在于创建它的查询范围内。
所以我不能使用临时表,因为当我想第二次查询它时,它会消失

所以我使用“真实”表格来处理类似的事情。
我不确定我是否理解了您的算法示例是否正确,因此我将稍微简化示例。我希望我能把我的观点说清楚:

这是表(这可能不是有效的MySQL,只是为了展示概念):

正如我之前所说的,它不是字面上的“临时”表,它实际上是一个真正的永久表,只用于临时数据

现在,用户打开应用程序,输入搜索词并按下“搜索”按钮

然后启动资源密集型算法计算一次结果,并将其存储在表中:

insert into AlgorithmTempTable (QueryID, Rank, Value)
select '12345678-9012-3456789', foo, bar
from Whatever

insert into AlgorithmTempTable (QueryID, Rank, Value)
select '12345678-9012-3456789', foo2, bar2
from SomewhereElse
客户端必须知道Guid。也许您可以使用客户机的SessionID(如果他有一个SessionID,并且不能同时启动多个查询……或者每次用户按下“搜索”按钮时,您都会在客户机上生成一个新的Guid,或者诸如此类)

现在所有的计算都完成了,结果的排名列表保存在表中。
现在,您可以查询该表,按查询ID进行过滤:

select Rank, Value
from AlgorithmTempTable
where QueryID = '12345678-9012-3456789'
order by Rank
limit 0, 10
由于QueryID,多个用户可以同时执行此操作,而不会干扰彼此的查询。如果为每个搜索创建一个新的QueryID,同一用户甚至可以一次运行多个查询

现在只剩下一件事要做:在不再需要临时数据时删除它(只有数据!表永远不会被删除)。
因此,如果用户关闭查询屏幕:

delete
from AlgorithmTempTable
where QueryID = '12345678-9012-3456789'
但在某些情况下,这并不理想。如果应用程序崩溃,数据将永远留在表中。
有几种更好的方法。哪一个是最好的
delete
from AlgorithmTempTable
where QueryID = '12345678-9012-3456789'