【问题标题】:MYSQL PHP querying already queried data ( Filtering already filtered data)MYSQL PHP 查询已查询数据(过滤已过滤数据)
【发布时间】:2011-04-29 00:30:18
【问题描述】:

我有一个返回超过 30,000 条记录的复杂查询。我们一次向用户显示 100 条记录,用户必须单击下一步才能获取下 100 条记录。

这里的问题是我们再次对数据库运行复杂查询并添加 LIMIT 100 、 200 以获取接下来的 100 条记录。

除了这种复杂性之外,我们在客户端还有其他过滤器,必须对 30,000 条记录执行。数据库中有大约 100,000 个用户。因此,对于非常活跃的活动,我们一次又一次地运行那个复杂的查询。

有什么方法可以保留 30,000 条记录并对其进行操作?我检查了临时 MYSQL 表。但我认为我们不能在这种情况下使用它们。要将数据存储在物理表中并对其进行查询,如果 1000 个用户尝试一次访问这个未来并以编程方式处理它(插入和删除操作),那真的会是一团糟

更新以提供更多细节

-> 这是确切的场景,汽车公司希望查看给定距离内的所有汽车,例如从给定纬度和经度算起 100 英里半径内的汽车和用户详细信息。完成此操作后,组合框中会显示汽车型号,并在该数据表下方显示所有信息。同样在每一列的顶部有一个用于在该列上搜索的文本字段(例如,在客户名称上,输入两个字母开始过滤数据)。 1) 让城市在 100 英里内 2)查询数据库(这里结合5个表) 3) 从上述查询中获取车型列表并显示在列表框中 4) 向用户显示 100 条记录 5) 根据 copbox 框列表和每列的文本字段进行过滤

如此简单:) -->

感谢您的帮助

问候

基兰

【问题讨论】:

  • 我很想看到一些解决方案,因为我不时遇到这类问题。您是否查看过视图?
  • 感谢 Dan 的 cmets,请参阅我更新的问题。在这种情况下,我认为 Views 对我没有帮助

标签: php mysql filter


【解决方案1】:

我公司的应用程序处理超过 200 万条记录和大量连接,我们使用 jQuery DataTables 非常优雅地处理了这个确切的问题。是的,这就是前端技术……但是用户、数据表和我们的查询之间的交互使它成为一个非常优雅的解决方案。除了为表建立索引之外,我们根本不做任何视图或存储过程,而且它适合 zippy。

DataTables 是一个网格——一个具有额外功能的表格,包括排序、分页、过滤等。它通过 Ajax、X 一次抓取数据,并向查询添加额外元素以实现额外功能。它真正闪耀的地方是当您使用称为“管道”的功能时,它会在您显示的内容之前和之后抓取数据,从而减少查询量,同时为用户提供更快的查看体验。它是一个内置功能,非常易于部署。

这是关于流水线的 tut:http://datatables.net/examples/server_side/pipeline.html

这是我使用的查询示例:

public static function getQueue( $q=false) {
            $connect = new db_connection();

            $query  = ' SELECT something
                                    FROM table
                        WHERE 1 ';

            if ($q['id']) {
                $query .= " AND id = ".$q['id']." ";
            }

            if ($q['sortOrder']) {
                $query .= "ORDER BY " . $q['sortField']. " " .$q['sortOrder']. " ";
            }

            if ($q['limit']) {
                $query .= ' LIMIT '.$q['limit'];
            }

            if ($q['offset']) {
                $query .= ' OFFSET '.$q['offset'];
            }

            $result = $connect->query($query);
            $queue_array = $connect->fetchAll($result);

            return $queue_array;

        }

如果您以前从未使用过 Jquery Ajax,它会在字符串中查找结果。所以,我有一个页面,它使用上面的查询调用下面的函数来回显结果。我称它为我的 ajaxDispatcher:

public static function showQueue($info) {

            $q['limit'] = $info['iDisplayLength'];
            $q['offset'] = $info['iDisplayStart'];

            //Ordering
            if ( isset( $info['iSortCol_0'] ) )  {
              for ( $i=0 ; $i < $info['iSortingCols']; $i++ ) {
                  $q['sortField'] .= self::queueHeaders($info['iSortCol_'.$i]);
                  $q['sortOrder'] .= $info['sSortDir_'.$i];
              }
            }

            $callqueue = self::getQueue($q);                    //Gets results with dependencies
            $prospect_count = self::getCount();                 //Gets total record count

            $string = '{"sEcho": '.intval($_REQUEST['sEcho']).', "iTotalRecords": '.intval($prospect_count).', "iTotalDisplayRecords": '.(int)$prospect_count.', "aaData":[';


            foreach ($callqueue as $c ) {
                $locked = ($c['locked'] == 1)?'<input type="checkbox" checked disabled>':'<input type="checkbox" disabled>';
                $scheduled_date = ($c['callback_date_time'])?date("M d Y g:ia", strtotime($c['callback_date_time'])):'';

                if ($count != 0)  $midstring .= "," ;
                $midstring .= '["'.$c['priority'].'", "'.addslashes($locked).'", "'.$scheduled_date.'", "'.$c['company_name'].'", "'.$c['marcom_name'].'", "'.$c['marcom_description'].'"]';
                $count++;
            }

            $endstring .= ']}';

            $finalstring = $string.$midstring.$endstring;

            return $finalstring;

     }

当我终于弄清楚这一切时,这个工具改变了我们公司的游戏规则。我们从一个(设计不佳的)手动寻呼系统转变为 ajax 调用和交互性,这对用户体验产生了影响。在某种程度上,您通过查询和交互的间距“欺骗”了用户......但它确实有效。

【讨论】:

  • 谢谢@bpeterson76。我尝试了 Jquery 数据表。但对于我的情况,我需要在服务器端提供一些解决方案以避免一次又一次地查询数据库
  • 好吧,流水线会将您的查询减半。我会说这是一个相当不错的改进...它将工作从您的服务器推送给用户。
【解决方案2】:

我可以推荐以下方法来处理许多数据搜索。

当用户第一次发出搜索时,查询记录的ID,匹配他的所有过滤器。然后每次需要渲染页面时,使用限制子句查询数据库中具有这些 id 的记录。这将显着降低数据库负载,因为您无需一次又一次地应用过滤器,只需按主键选择记录。

【讨论】:

  • 感谢@FractalizeR。你能详细说明你的答案吗?我用更多细节更新了我的问题。再次非常感谢
  • 问题是,这就是数据库的用途——获取数据(使用过滤器)并将它们吐出。这增加了第二个查询的开销,当您可以在需要时获取所需的数据。使用这种方法真正可以实现的唯一改进是一些同时进行复杂连接的方法,这确实会显着减慢速度。但是谁想让用户等待最初发生呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 2013-12-13
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 2017-10-30
相关资源
最近更新 更多