2014-09-03 34 views
0

让我们假设我使用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'开始,那么我将不得不更新数千万行,以便为它设置alphabetically_sorted_title_number (将新图书添加到必须列出的所有图书中) 插入性能急剧下降,有没有办法避免这种情况或加快速度?我听说PostgreSQL可以做到这一点,这是真的吗?

+0

如果你真的有数亿行的,你可能要重新考虑其在那些单一实例的单表... – 2014-09-03 10:57:33

+0

Eugen Rieck,是否比其他方法更好?如果oracle或postgre(就像下面提到的那样),他们真的可以帮助吗? – Bob 2014-09-03 14:52:12

+0

单片RDBMS一般不会按成本进行扩展,一旦您达到数百万行和每秒数千次查询。 – 2014-09-03 16:10:12

回答

-1

最好的方法是将您的bd更改为oracle或postgre(免费选项)。 postgres与oracle相比具有相似的速度,并且与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 
+1

这个问题表明,标题是索引的,因此你的代码在这里没用,你的意思是分割搜索? oracle/postgre如何帮助? – Bob 2014-09-03 11:55:08

相关问题