我试图在一个包含500k行的模型中对记录进行排序。当我最初尝试此过程时,我只有200条记录并使用以下代码并取出记录1-5以列出最受欢迎的记录:
@mostpopular = Product.find(:all, :order => 'click_count DESC')
然而,现在我有一个更大的数据集,这会让我的计算机停止工作,我希望尝试以更有效的方式完成搜索。
我已尝试将代码调整为@mostpopular = Product.order('click_count DESC').limit(10)
,但这仍需要很长时间才能完成......
是否有更有效的方法从大型数据集中提取前10个最受欢迎的记录?
感谢您的时间
答案 0 :(得分:1)
答案很可能不在rails中,而是在你的数据库中。
将查询写入日志,以便查看正在执行的查询:
logger.debug Product.find(:all, :order => 'click_count DESC').limit(10).to_sql
一旦掌握了SQL,请转到数据库的控制台,并要求它向您显示该查询的查询计划和统计信息。您没有说明您正在使用的数据库,但在postgresql中,您将使用EXPLAIN命令。我会在你看到正在进行行扫描(也就是序列扫描)。
您可能会发现click_count
缺少索引,添加它可以解决您的问题。
答案 1 :(得分:1)
答案 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")
通过上述查询查看效率或时间消耗。