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