数百万页的快速分页 - 如何?

时间:2014-09-03 10:51:59

标签: mysql database pagination

让我们假设我正在使用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表模式:

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' A'我将不得不更新数千万行来为它设置alphabetically_sorted_title_number (在新书之后必须列出的所有书籍中加1) 插入性能急剧下降,有没有办法避免这种情况或加快速度?我听说PostgreSQL可以用这个做点什么,这是真的吗?

1 个答案:

答案 0 :(得分:-1)

最好的是将你的bd改为oracle或postgre(免费选项)。与oracle相比,postgres具有相似的速度,并且与mysql兼容。

如果你坚持使用mysql,最好的选择是划分你的搜索。其他问题是"顺序由"在:

 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