【问题标题】:Fast pagination for millions of pages - how?数百万页的快速分页 - 如何?
【发布时间】:2014-09-03 19:32:56
【问题描述】:

假设我正在使用 MySQL 并制作一个书店应用程序,该应用程序显示所有可用书籍的分页列表(其中包含数亿本书)

db_table bookstore
    id = auto incremented primary key
    title = character field (indexed)

如果我尝试这样的事情:

SELECT * FROM `db_table` ORDER BY `title` OFFSET 20.000.000 LIMIT 50

这将花费太多时间(可能超过 10 秒,这已经太多了)

为了减少这个时间,我以这种方式调整数据库表架构:

db_table bookstore
    ...
    alphabetically_sorted_title_number = integer field (indexed)

然后我可以像这样查询页面:

SELECT * FROM `db_table` WHERE `alphabetically_sorted_title_number` > 20.000.000 ORDER BY `title` LIMIT 50

不到 1 秒 但是如果我想添加一本书怎么办?如果它的标题以'A'开头,我将不得不更新数千万行来为其设置alphabetically_sorted_title_number (必须在新书之后列出的所有书籍加1) 插入性能急剧下降,有没有办法避免这种情况或加快这种情况?我听说 PostgreSQL 可以用这个做点什么,是真的吗?

【问题讨论】:

  • 如果您确实有数亿行,您可能需要重新考虑将它们放在单个实例的单个表中...
  • Eugen Rieck,这是一个比其他任何解决方案更好的解决方案吗? oracle 或 postgre 怎么样(正如那里的 ppl 建议的那样),它们真的能以某种方式提供帮助吗?
  • 单片 RDBMS 通常不能很好地扩展成本,一旦您达到每秒数以百万计的行和数千个查询。

标签: mysql database pagination


【解决方案1】:

最好的方法是将您的 bd 更改为 oracle 或 postgre(免费选项)。 postgres 的速度与 oracle 相近,并且兼容 mysql。

如果你坚持使用mysql,最好的选择是划分你的搜索。另一个问题是“order by”:

 SELECT * FROM `db_table` WHERE `alphabetically_sorted_title_number` > 20.000.000 ORDER BY `title` LIMIT 50

如果“标题”不是索引,则您的搜索会很困难并且会减慢您的结果。 试试这个:

Create index `index_title` ON `db_table`(col) ASC<br><br>

重复您的查询:

SELECT * FROM `db_table` WHERE `alphabetically_sorted_title_number` > 20.000.000 ORDER BY `title` LIMIT 50

【讨论】:

  • 问题指出标题已被索引,因此您的代码在这里没用,您所说的划分搜索是什么意思? oracle/postgre 如何提供帮助?
猜你喜欢
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 2017-05-17
  • 1970-01-01
相关资源
最近更新 更多