让我们假设我正在使用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可以用这个做点什么,这是真的吗?
答案 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