MySql:在表上运行大量搜索查询的最佳方式

时间:2011-08-22 19:34:22

标签: mysql relational-database

我有两个表,一个是我需要搜索的静态数据库,另一个是动态的,我将用它来搜索第一个数据库。现在我有两个单独的查询。首先在页面加载时,第二个表的值作为搜索项传递给第一个,我使用cURL“捕获”搜索结果。这是非常低效的,可能是非常错误的方法,所以我需要帮助来解决这个问题。目前页面(html,前端)需要40秒才能加载。

可能的解决方案:将其转换为功能,但仍会拨打许多电话。将表加载到内存中,然后运行查询并在完成后卸载缓存。使用正则表达式来帮助加快查询速度?可能加入?但我是一个菜鸟,所以我只能想象......

搜索脚本:

require 'mysqlconnect.php';

    $id = NULL;
    if(isset($_GET['n'])) {     $id = mysql_real_escape_string($_GET['n']);     }
    if(isset($_POST['n'])) {    $id = mysql_real_escape_string($_POST['n']);    }

    if(!empty($id)){
        $getdata = "SELECT id, first_name, last_name, published_name,
                    department, telephone FROM $table WHERE id = '$id' LIMIT 1"; 

        $result = mysql_query($getdata) or die(mysql_error());
        $num_rows = mysql_num_rows($result);

        while($row = mysql_fetch_array($result, MYSQL_ASSOC))
        {
            echo <<<PRINTALL
            {$row[id]}~~::~~{$row[first_name]}~~::~~{$row[last_name]}~~::~~{$row[p_name]}~~::~~{$row[dept]}~~::~~{$row[ph]} 
PRINTALL;
        } 
    }

HTML网页脚本:

require 'mysqlconnect.php';
    function get_data($url)
    {
      $ch = curl_init();
      $timeout = 5;
      curl_setopt($ch,CURLOPT_URL,$url);
      curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
      curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
      $data = curl_exec($ch);
      curl_close($ch);
      return $data;
    }

    $getdata = "SELECT * FROM $table WHERE $table.mid != '1'ORDER BY $table.$sortbyme $o LIMIT $offset, $rowsPerPage";
    $result = mysql_query($getdata) or die(mysql_error());

    while($row = mysql_fetch_array($result, MYSQL_ASSOC))
    {
            $idurl = 'http://mydomain.com/dir/file.php?n='.$row['id'].'';
            $p_arr = explode('~~::~~',get_data($idurl));
            $p_str = implode(' ',$p_arr);

           //Use p_srt and p_arr if exists, otherwise just output rest of the
           //html code with second table values


    } 

正如你所看到的,第二个表可能有也可能没有有效的id,因此没有结果,但第二个表是安静的大,总而言之,我正在阅读并输出15k +表格单元格。正如您可以从代码中看到的那样,我已经尝试过分页,但该解决方案并不符合我的需求。我必须在单个html页面中将客户端的所有数据都包含在内。所以请建议。

谢谢!

修改

第一张表:

id_row    id          first_name   last_name    dept    telephone
1         aaa12345    joe          smith        ANS     800 555 5555
2         bbb67890    sarah        brown        ITL     800 848 8848

Second_table:

id_row    type        model        har               status    id         date         
1         ATX         Hybrion      88-85-5d-id-ss    y         aaa12345   2011/08/12
2         BTX         Savin        none              n         aaa12345   2010/04/05
3         Full        Hp           44-55-sd-qw-54    y         ashley a   2011/07/25
4         ATX         Delin        none              _         smith bon  2011/04/05

所以第二个表是读取和显示的表,如果ID是正匹配则首先读取并显示信息。 ID在第一个中唯一,第二个具有多格式输入,因此它可以是ID,也可以不是ID,也可以是重复ID。希望这能让我更好地理解我需要的东西。再次感谢!

1 个答案:

答案 0 :(得分:2)

一些事情:

  1. 这里完全不需要卷曲。
  2. Order by会大大减慢您的查询速度。
  3. 我会在ID上输入if is_numeric。
  4. 为什么在查询中限制为1时使用whilemysql_num_rows$table和其他这些事情在哪里设定? 缺少代码。

    如果您为我们提供了两个表格的数据结构,我们可以帮助您解决问题,但现在您的设置方式,我甚至对它的工作感到惊讶。

    您正在做的是,对于$table中的每一行,mid!=1您正在执行第二页的卷曲调用,该第二页再次获取ID和查询。这真的很糟糕,而且比它需要的更复杂。让我们看看你的桌子结构。

    基本上你可以这样做:

    select first_name, last_name, published_name, department, telephone FROM $table1, $table2 WHERE $table1.id = $table2.id and $table2.mid != 1;
    

    摆脱卷曲,摆脱爆炸/爆炸。