浏览 3359 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-04-17
使用paginate_by_sql方法来search数据时生成这样的两条SQL语句: SELECT COUNT(*) FROM(select a.* from table_a where ... order by id asc) AS count_table select a.* from table_a where ... order by id asc 这样的SELECT COUNT语句的性能就很有问题了。 查看will_paginate的实现-》finder.rb: def paginate_by_sql(sql, options) options, page, per_page = wp_parse_options!(options) sanitized_query = sanitize_sql(sql) total_entries = options[:total_entries] || count_by_sql("SELECT COUNT(*) FROM (#{sanitized_query}) AS count_table") returning WillPaginate::Collection.new(page, per_page, total_entries) do |pager| options.update :offset => pager.offset, :limit => pager.per_page add_limit! sanitized_query, options pager.replace find_by_sql(sanitized_query) end end 原来paginate_by_sql方法有一个:total_entries参数,这样我们可以自己写优化的不需要order by的省略很多查询条件的count语句,然后将count number作为参数:total_entries传过去即可: def get_count_of_xxx count_by_sql "select count(1) from table_a a where ..." end def get_xxx paginate_by_sql "select a.* from table_a where ... order by id asc", :total_entries => get_count_of_xxx end 这样能优化不少search方法的性能 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-04-17
明天去体验下。呵呵
|
|
返回顶楼 | |
发表时间:2008-04-18
留 :total_entries 参数的目的正是在于此呀。
这是很好的api设计模式,不给我足够的信息,我也有办法做到,只是效率较低。给我足够的信息,就可以立即可以提高效率。 |
|
返回顶楼 | |