MySql: лучший способ запустить большое количество поисковых запросов в таблице - PullRequest
0 голосов
/ 22 августа 2011

У меня есть две таблицы, одна - статическая база данных, в которой мне нужно искать, другая - динамическая, которую я буду использовать для поиска в первой базе данных. Прямо сейчас у меня есть два отдельных запроса. Сначала при загрузке страницы, значения из второй таблицы передаются в первую в качестве поискового запроса, и я «захватываю» результат поиска с помощью cURL. Это очень неэффективный и, вероятно, действительно неправильный способ сделать это, поэтому мне нужна помощь в устранении этой проблемы. В настоящее время загрузка страницы (html, front-end) занимает 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


    } 

Как видите, вторая таблица может иметь или не иметь действительный идентификатор, следовательно, никаких результатов, но вторая таблица очень большая, и в целом, я читаю и вывожу 15k + ячеек таблицы. И, как вы, вероятно, можете видеть из кода, я пробовал пейджинг, но это решение не соответствует моим потребностям Я должен иметь все данные на стороне клиента в одной HTML-странице. Поэтому, пожалуйста, совет.

Спасибо!

EDIT

Первый стол:

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

Таким образом, вторая таблица - это та, которая читается и отображается, сначала читается и отображается информация, если идентификатор соответствует положительному. Идентификатор уникален только в первом, второй имеет многоформатный ввод, поэтому он может быть или не быть идентификатором, а также может быть дублированным идентификатором. Надеюсь, что это дает лучшее понимание того, что мне нужно. Еще раз спасибо!

1 Ответ

2 голосов
/ 22 августа 2011

Несколько вещей:

  1. Скручивание здесь совершенно не нужно.
  2. Упорядочение по значительно замедлит ваши запросы.
  3. Я бы добавил, еслиis_numeric проверка идентификатора.

Почему вы используете while и mysql_num_rows, когда вы ограничиваете 1 в запросе?Где находятся $table и все эти другие вещи?Код отсутствует.

Если вы предоставите нам структуру данных для двух рассматриваемых таблиц, мы можем помочь вам с запросами, но, как вы настроили это сейчас, я удивлен, что он даже работает надall.

То, что вы делаете, для каждой строки в $table, где mid!=1 вы выполняете вызов curl для 2-й страницы, которая принимает идентификатор и снова запрашивает.Это действительно очень плохо и гораздо более запутанно, чем должно быть.Позволяет увидеть структуру вашего стола.

В основном вы можете сделать:

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

Избавиться от локона, избавиться от взрыва / взрыва.

...