这应该是一个相当普遍的问题。我在堆栈溢出问题数据库中找不到解决方案。我不确定我是否做了正确的搜索。
我运行一个MySQL,CGI/Perl站点。可能一天有1000的点击量。用户可以在数据库中搜索该网站。where子句可能会变得相当长。我每页显示10个项目,并为用户提供转到下一页和前一页的链接。目前,每当用户点击“上一页”或“下一页”链接时,我都会进行新的搜索。我使用
LIMIT num-rows-to-fetch OFFSET num-rows-to-skip以及查询语句。然而,对于后续搜索来说,响应时间太长了。随着我添加更多的用户,这种情况只会变得更糟。我正在试着看看我是否可以用一种更好的方式来实现它。
如果你能给我一些建议,我将不胜感激。
发布于 2011-02-21 23:45:00
如果你不介意使用Javascript,你应该检查一下DataTables。通过这种方式,您可以将所有行发送到客户端,并在客户端完成分页。
如果这不是一个选项,那么您可以尝试使用mod_perl或CGI::Session来保存页面查询之间的查询结果,这样您就不需要一次又一次地查询mysql。
发布于 2011-02-21 23:32:49
您可以尝试分析查询,以找出对数据库造成最大麻烦的部分。如果存在联接,则可以创建包含查询中使用的键字段和可能的筛选字段的索引。但是,根据数据库布局和大小,这可能会创建大量索引。而且,如果查询可能发生重大变化,如果您没有为特定情况创建索引,您可能仍然会感到困惑。在任何情况下,我都会首先分析查询,试图找出查询如此缓慢的原因。如果有一个主要原因导致性能不佳,您可以尝试抛出索引。
另一种方法是将搜索结果缓存到内存中,并从那里进行分页,从而完全避免数据库往返。根据您的数据库大小,您可能希望将搜索结果限制为一个合理的数字。
发布于 2011-02-23 15:48:35
我从未使用过这个模块,所以不能保证它的性能,但可以看看DBI::ResultPager
https://stackoverflow.com/questions/5067520
复制相似问题