0

我有一个 as400 表,其中包含大约 100 万行全名/公司名称,我想将其转换为使用另一个数据存储,同时仍与原始数据存储相匹配。

目前,用户输入搜索并几乎立即获得搜索词在表中的字母位置和匹配页面。然后,用户可以非常快速地向上或向下分页记录。

几乎没有数据更新,每周大约有 50 次插入。我认为任何数据库都可以维护名称的字母索引,但我不确定如何在数据集中快速找到搜索的位置。非常感谢任何建议。

4

3 回答 3

2

这听起来就像结果的常规分页,除了它不是根据请求的页码或偏移量转到特定页面,而是根据用户搜索在结果中的字母顺序进入特定页面。

假设您想在该位置之后获取 10 行,之前获取 10 行。

如果用户搜索“Smith”,您可以进行两次选择:

SELECT
  name
FROM
  companies
WHERE
  name < 'Smith'
ORDER BY
  name DESC
LIMIT 10

进而

SELECT
  name
FROM
  companies
WHERE
  name >= 'Smith'
ORDER BY
  name
LIMIT 10

你可以做一个 UNION 来在一个查询中获取它,上面只是简化了。

用户搜索的术语将适合这些结果的一半。如果有任何精确匹配,则第一个精确匹配将被定位为第十一个。

请注意,如果用户搜索“aaaaaaaa”,那么他们可能只会得到前 10 个结果,而之前没有任何内容,而对于“zzzzzzzz”,他们可能只会得到最后的 10 个结果。

我假设有问题的 SQL 引擎允许 >= 和 < 字符串之间的比较(并且可以在索引中优化它),但我没有测试过,也许你不能这样做。如果像 MySQL 一样,它支持国际化排序规则,那么您甚至可以为非 ascii 字符正确排序。

于 2009-03-07T16:20:34.707 回答
1

如果“搜索的位置”是指按字母顺序枚举的记录编号,您可能想尝试以下操作:

select count(*) from companies where name < 'Smith'

大多数数据库应该可以很好地优化这一点(但试试吧——你在网上读到的理论并不胜过经验数据)。

于 2009-03-07T16:57:01.827 回答
1

只是添加到订购建议:

  • 如果这是您的标准数据检索方式,请在名称中添加索引。
  • 您可以通过结合LIMIT 和 OFFSET来有效地进行分页。
于 2009-03-07T17:32:39.323 回答