Выборка из большой базы - проблема со временем работы скрипта

  • Автор темы Автор темы seipa
  • Дата начала Дата начала

seipa

Новичок
Привет. Осваиваю PHP и MySQL, и сейчас бьюсь над такой проблемой:

Есть большая таблица на 500 строк, и штук 15 столбцов. Задача состоит в том, чтобы вытянуть из таблицы все(!) строки по нескольким столбцам. Есть ещё и форма для фильтрации, но речь пока не о ней.

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

Подскажите какие есть методы оптимизации таких запросов, что нужно использовать вместо циклов, какие есть инструменты.

Заранее благодарен
 
seipa, 500 строк и 13 секунд? Индексы забыл или комп из серии p2-266 mmx?

Код показывай.
 
таблицу с 500 строк сложно назвать большой, но не в этом суть)

и вам точно надо вытягивать все 500 записей? используйте limit и offset

Код:
SELECT * FROM test_table ORDER BY id LIMIT 10, 20
- вытянуть 10 строк начиная с 20й
 
таблицу с 500 строк сложно назвать большой, но не в этом суть)

и вам точно надо вытягивать все 500 записей? используйте limit и offset

Код:
SELECT * FROM test_table ORDER BY id LIMIT 10, 20
- вытянуть 10 строк начиная с 20й

то есть разбить на страницы по 10 записей?
 
seipa, 500 строк и 13 секунд? Индексы забыл или комп из серии p2-266 mmx?

Код показывай.

PHP:
$max = mysql_fetch_assoc(mysql_query('SELECT MAX(id) FROM TRANSAKCJE'));
        foreach($max as $k=>$v){
           
            $id=1;
           
            while ($id <= $v){
                $arrayNetBaza = mysql_fetch_assoc(mysql_query('SELECT `termin`, `data`, `orgStrona`, `dSkrot`, `dNumer`, `dSymbol`,`baza`, `kontrahent`, `doRozlZl`, `doRozlWal`, `waluta`, `kurs` FROM `TRANSAKCJE` WHERE `id`='.$id.''.$typ_dokumentu.''.$kontoTemp.''.$rozrachunki_z.' AND `rozliczona` = "0"'.$typ_rozrachunkow.''));
       
                if ($arrayNetBaza['data'] !== NULL){
                echo '
                <tr>
                    <td>'.$dniPoTermine.'</td>
                    <td>'.$arrayNetBaza["termin"].'</td>
                    <td>'.$arrayNetBaza["data"].'</td>
                    <td>'.$stan.'</td>
                    <td>'.$arrayNetBaza["dSkrot"].' '.$nrEw.'</td>
                    <td>'.$arrayNetBaza["dSymbol"].'</td>
                    <td>'.$kontr.'</td>
                    <td>'.$tempKontr.'</td>
                    <td>'.$arrayNetBaza["doRozlZl"].'</td>
                    <td>'.$arrayNetBaza["doRozlWal"].'</td>
                    <td>'.$wal.'</td>
                </tr>
                ';
                }
                $id++;
                }
            }

Вот такой код. $id перебирал потому что строки пронумерованы не по порядку, некоторых id не хватает.
 
PHP:
$max = mysql_fetch_assoc(mysql_query('SELECT MAX(id) FROM TRANSAKCJE'));
        foreach($max as $k=>$v){
          
            $id=1;
          
            while ($id <= $v){
                $arrayNetBaza = mysql_fetch_assoc(mysql_query('SELECT `termin`, `data`, `orgStrona`, `dSkrot`, `dNumer`, `dSymbol`,`baza`, `kontrahent`, `doRozlZl`, `doRozlWal`, `waluta`, `kurs` FROM `TRANSAKCJE` WHERE `id`='.$id.''.$typ_dokumentu.''.$kontoTemp.''.$rozrachunki_z.' AND `rozliczona` = "0"'.$typ_rozrachunkow.''));
      
                if ($arrayNetBaza['data'] !== NULL){
                echo '
                <tr>
                    <td>'.$dniPoTermine.'</td>
                    <td>'.$arrayNetBaza["termin"].'</td>
                    <td>'.$arrayNetBaza["data"].'</td>
                    <td>'.$stan.'</td>
                    <td>'.$arrayNetBaza["dSkrot"].' '.$nrEw.'</td>
                    <td>'.$arrayNetBaza["dSymbol"].'</td>
                    <td>'.$kontr.'</td>
                    <td>'.$tempKontr.'</td>
                    <td>'.$arrayNetBaza["doRozlZl"].'</td>
                    <td>'.$arrayNetBaza["doRozlWal"].'</td>
                    <td>'.$wal.'</td>
                </tr>
                ';
                }
                $id++;
                }
            }

Вот такой код. $id перебирал потому что строки пронумерованы не по порядку, некоторых id не хватает.

Во-первых не используйте библиотеку mysql так как она устарела http://php.net/manual/ru/function.mysql-fetch-assoc.php
Во-вторых в этом коде вы не вытаскиваете все значения одним запросом.. вы делаете для кажного значания один запрос, тоесть у вас получается 500 запросов к mysql
посмотрите http://php.net/manual/ru/mysqli-result.fetch-array.php если вы вытащите все записи сразу, это будет быстрее... а еще лучле исползовать LIMIT и сделать постраничный вывод значений
 
Во-первых не используйте библиотеку mysql так как она устарела http://php.net/manual/ru/function.mysql-fetch-assoc.php
Во-вторых в этом коде вы не вытаскиваете все значения одним запросом.. вы делаете для кажного значания один запрос, тоесть у вас получается 500 запросов к mysql
посмотрите http://php.net/manual/ru/mysqli-result.fetch-array.php если вы вытащите все записи сразу, это будет быстрее... а еще лучле исползовать LIMIT и сделать постраничный вывод значений

Спасибо большое, сейчас ознакомлюсь
 
Все проблемы от трех фатальных заблуждений.
1. Что база в 500 строк большая. Это не большая база. А просто мизерная. Микроскопическая. Ей не нужны ни индексы, ни оптимизация, ни поиски. Её можно тупо подтянуть в скрипт всю, и фильтровать руками. или запросом. или запрашивать по одной строке - без разницы
2. Что id имеет хоть какое-то отношение к "нумерации" записей.
3. Что не прочитав даже базовый учебник, можно начинать изобретать собственный код.
 
3. Что не прочитав даже базовый учебник, можно начинать изобретать собственный код.

Если бы всем было достаточно "базовых учебников" и все были такими специалистами, о которых Вы пытаетесь намекнуть, форумы, подобны этому, наверное, не нужны были бы, не так ли?
 
seipa, надо не пытаться откусаться от предложения @Фанат, а пойти и прочитать книжку. Тебе же будет комфортнее
 
Если бы всем было достаточно "базовых учебников" и все были такими специалистами, о которых Вы пытаетесь намекнуть, форумы, подобны этому, наверное, не нужны были бы, не так ли?
Ты не можешь рассуждать об этом, поскольку базового не прочитал.
Вот прочтешь - тогда приходи, подискутируем, кому чего достаточно.
 
Прикльконо - ни разу в жизни так не писал
mysql_fetch_assoc(mysql_query(
что то новое открыл для себя...
 
Прикльконо - ни разу в жизни так не писал
mysql_fetch_assoc(mysql_query(
что то новое открыл для себя...
Не шути так. Тот, кто так пишет, тут же превращается в тыкву.
Открой для себя лучше пользовательские функции.
 
Сверху