2

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

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

但是,现在我有一个更大的数据集,这会使我的计算机停止运行,我希望尝试以更有效的方式完成搜索。

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

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

谢谢你的时间

4

3 回答 3

1

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

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

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

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

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

于 2013-05-04T12:37:10.860 回答
1

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

add_index :products, :click_count

然后运行rake db:migrate

于 2013-05-04T12:56:53.093 回答
0

首先根据您的系统或服务器配置设置排序缓冲区大小。同样对于 MySQL 根目录中 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")

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

于 2013-05-04T12:54:27.630 回答