【问题标题】:Sphinx get millions of results狮身人面像获得数百万个结果
【发布时间】:2012-11-01 03:24:43
【问题描述】:

我使用 MySQL + Sphinx 来存储数百万行数据。我们有网站可以查看我们数据库中的所有信息。

例如,电影标题(100,000,000 行)。我需要在我们的网站上查看所有这些内容,每页 100 个标题。另外,我需要按演员受欢迎程度排序。

对于前 10 页,一切都很好。但在那之后我达到了max_matches 的限制。增加此限制将强制 sphinx 使用更多 CPU/RAM。

另外,我什至无法将 max_matches 设置为 20,000,000

警告:max_matches=20000000 超出范围;使用默认 1000

我可以使用 MySQL 执行如下查询:

SELECT * FROM titles WHERE tid >= $start AND tid <= $end

使用 tid 索引。但我无法按 tid 对其进行排序。我需要按其他表格中的信息对我的标题进行排序。

访问数百万行、排序并快速完成的最佳方式是什么?请帮忙。

更新:来自 sphinx 来源:/src/searchd.cpp

if ( iMax<0 || iMax>10000000 )
{
    sphWarning ( "max_matches=%d out of bounds; using default 1000", iMax );
} else
{
    g_iMaxMatches = iMax;
}

10000000 是限制吗?我怎样才能得到更多的补偿?

【问题讨论】:

  • 这个不推荐,直接分页不行吗?
  • 你是什么意思?问题是,我无法对其进行分页...
  • 你能做的就是将数百万行分成更小的结果集,每次,你只需获取 1000 条记录,我的意思是,一个循环
  • 你真的需要1000万的offset吗?即使你每页放 1000 页,那也是 10K 页——我怀疑有人会走得那么远。请注意, max_matches 是针对返回的结果,这并不意味着它将仅搜索 1000 万个。例如,谷歌不允许你超过 1000 偏移量:)
  • 是的,我需要数千页。我确实需要。我的任务。

标签: mysql performance sphinx


【解决方案1】:

如果您的排序顺序是基于属性(演员受欢迎程度) - 而不是狮身人面像计算的权重 - 那么可以只使用游标代替。

因为可以通过这个属性过滤。

http://sphinxsearch.com/forum/search.html?q=cursors&f=1

我确实想知道你是否真的需要它。每页 100 个项目,max_matches 为 1M,意味着 10,000 页结果。您的访问者真的会阅读 10,000 页的结果吗?

【讨论】:

    【解决方案2】:

    使用LIMIT (select api) 检索特定页面。

    任何你想要排序的东西都需要包含在索引中,你不能在这里使用连接。

    【讨论】:

    • 我仍然有偏移限制:ERROR 1064 (42000): query 0 error: offset out of bounds (offset=1000000, max_matches=1000)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多