2014-09-03 53 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