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

seipa

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

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

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

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

Заранее благодарен
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
seipa, 500 строк и 13 секунд? Индексы забыл или комп из серии p2-266 mmx?

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

StVolodymyr

Новичок
таблицу с 500 строк сложно назвать большой, но не в этом суть)

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

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

seipa

Новичок
таблицу с 500 строк сложно назвать большой, но не в этом суть)

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

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

seipa

Новичок
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 не хватает.
 

StVolodymyr

Новичок
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 и сделать постраничный вывод значений
 

seipa

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

Фанат

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

seipa

Новичок
3. Что не прочитав даже базовый учебник, можно начинать изобретать собственный код.
Если бы всем было достаточно "базовых учебников" и все были такими специалистами, о которых Вы пытаетесь намекнуть, форумы, подобны этому, наверное, не нужны были бы, не так ли?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
seipa, надо не пытаться откусаться от предложения @Фанат, а пойти и прочитать книжку. Тебе же будет комфортнее
 

Фанат

oncle terrible
Команда форума
Если бы всем было достаточно "базовых учебников" и все были такими специалистами, о которых Вы пытаетесь намекнуть, форумы, подобны этому, наверное, не нужны были бы, не так ли?
Ты не можешь рассуждать об этом, поскольку базового не прочитал.
Вот прочтешь - тогда приходи, подискутируем, кому чего достаточно.
 

StalkerClasses

Новичок
Прикльконо - ни разу в жизни так не писал
mysql_fetch_assoc(mysql_query(
что то новое открыл для себя...
 

Фанат

oncle terrible
Команда форума
Прикльконо - ни разу в жизни так не писал
mysql_fetch_assoc(mysql_query(
что то новое открыл для себя...
Не шути так. Тот, кто так пишет, тут же превращается в тыкву.
Открой для себя лучше пользовательские функции.
 
Сверху