2

我正在嘗試對包含500k行的模型中的記錄進行排序。當我最初嘗試這個過程我剛剛200記錄,用下面的代碼,並掏出記錄1-5列出那些是最流行:從具有500k記錄的模型中快速排序記錄

@mostpopular = Product.find(:all, :order => 'click_count DESC')

不過,現在我有一個大得多的數據集,這磨碎了我的電腦停下來,我正在嘗試以更有效的方式完成搜索。

我試圖調整代碼@mostpopular = Product.order('click_count DESC').limit(10)但仍需要很長的時間才能完成......

是否有從大型數據集拉出十大最受歡迎記錄的更有效的方法?

感謝您的時間

回答

1

答案是最有可能不是在導軌,它在你的數據庫中。

編寫查詢日誌,所以你可以看到正在做什麼查詢:

logger.debug Product.find(:all, :order => 'click_count DESC').limit(10).to_sql 

一旦你的SQL在你的手,頭部到你的數據庫的控制檯,並要求它向您展示查詢該查詢的計劃和統計信息。你不會說你正在使用什麼數據庫,但是在postgresql中,你可以使用EXPLAIN命令。我會讓你看到行掃描(又名序列掃描)正在完成。

您可能會發現click_count缺少索引,並添加它可以解決您的問題。

+0

感謝這麼快作出反應。我只是使用內置於Rails的sqllite3數據庫。我無法讓控制檯在過去運行,但會執行搜索指令並查看這次是否正常工作。感謝您的幫助,它非常有用,讓您瞭解問題所在的位置 – Texas 2013-05-04 12:48:06

0

首先根據您的系統或服務器配置設置排序緩衝區大小。也爲my.ini文件的MySQL中的根目錄此編輯內容:

[client] 
#password = your_password 
port  = 3306 
socket  = /tmp/mysql.sock 

# The MySQL server 
[mysqld] 
port  = 3306 
socket  = /tmp/mysql.sock 
skip-external-locking 
key_buffer_size = 16K 
max_allowed_packet = 1M 
table_open_cache = 4 
sort_buffer_size = 64K 
read_buffer_size = 256K 
read_rnd_buffer_size = 256K 
net_buffer_length = 2K 
thread_stack = 128K 

提高通過設置sort_buffer_size參考此鏈接http://www.mysqlperformanceblog.com/2007/08/18/how-fast-can-you-sort-data-with-mysql/ 它會提高你的應用程序的性能表現。

Product.find_by_sql("SELECT * FROM products ORDER BY click_count DESC LIMIT 10") 

查看以上查詢的效率或時間消耗。

+0

OP對我的回答中提到的數據庫是sqllite3 – 2013-05-04 13:21:52

1

您只需添加一個索引以提高查詢的速度。以下內容添加到一個migration

add_index :products, :click_count 

然後運行rake db:migrate