从具有500k记录的模型快速排序记录

时间:2013-05-04 12:30:55

标签: ruby-on-rails ruby-on-rails-3 sqlite activerecord database-performance

我试图在一个包含500k行的模型中对记录进行排序。当我最初尝试此过程时,我只有200条记录并使用以下代码并取出记录1-5以列出最受欢迎的记录:

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

然而,现在我有一个更大的数据集,这会让我的计算机停止工作,我希望尝试以更有效的方式完成搜索。

我已尝试将代码调整为@mostpopular = Product.order('click_count DESC').limit(10),但这仍需要很长时间才能完成......

是否有更有效的方法从大型数据集中提取前10个最受欢迎的记录?

感谢您的时间

3 个答案:

答案 0 :(得分:1)

答案很可能不在rails中,而是在你的数据库中。

将查询写入日志,以便查看正在执行的查询:

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

一旦掌握了SQL,请转到数据库的控制台,并要求它向您显示该查询的查询计划和统计信息。您没有说明您正在使用的数据库,但在postgresql中,您将使用EXPLAIN命令。我会在你看到正在进行行扫描(也就是序列扫描)。

您可能会发现click_count缺少索引,添加它可以解决您的问题。

答案 1 :(得分:1)

您只需添加索引即可提高查询速度。将以下内容添加到migration

add_index :products, :click_count

然后运行rake db:migrate

答案 2 :(得分:0)

首先根据您的系统或服务器配置设置排序缓冲区大小。另外对于MySQL root目录中my.ini文件的编辑内容:

[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")

通过上述查询查看效率或时间消耗。