【发布时间】: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