Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Нужна помощь по PHP + MySQL + БД большого размера


Автор: rodendron 24.4.2005, 13:25
Добый день!

Очень прошу вас о помощи, завтра показывать первую часть диплома, а у меня существует проблема следующего характера.
Тестировал все на маленьгой БД, 2000 записей, а потом как и положено установил 800 000 и вот оно началось...
В общем на запрос уходит по 30-40 минут. При 2000 записей все выполнялось за считанные секунды.

Вот сам запрос:

Код

SELECT v.kg AS KGN, v.KGP AS KGPN, GP.NAME AS GPN, v.GROT AS GROTN, GO.NAME AS GON, V.NV AS NVN, v.QGV AS QGVN, S.STNM AS STNMN, DATE(V.DAT_WYGR) AS DATN 
from vagreis AS v JOIN GROTA1251 AS GP on v.KGP = GP.TGNL AND v.ESR_WYGR = GP.ST 
LEFT JOIN GROTA1251 AS GO on v.GROT = GO.TGNL AND v.ESR_WYGR = GO.ST 
JOIN STNP AS S on SUBSTRING( S.ST, 1, 5 ) = v.ESR_WYGR 
JOIN KG as K on K.NAME = "Песок" AND K.KG = V.KG 
LIMIT 0, 30



Основная таблица - vagreis.
Это в ней было 2000 записей, а сейчас 800000.

Я же ставлю LIMIT и по идее у меня запрос же не должен зависеть от кол-ва записей.
Что посоветуете сделать?
А то проподаю очень сильно....
Помогите пожалуйста как можно скорее...
А то еще всю ночь с дизайном водиться ,а тут запрос не клеится.

Автор: Mal Hack 24.4.2005, 16:41
А с индексами у тебя как?
Еще ИМХО, запрос облегчить (разбить) постараться.

Автор: rodendron 24.4.2005, 17:20
Индексы уже сделаны smile
На все, что участвует в запросе... (

А разбивать тяжело в том плане что использую вывод постранично и т.д. ...

Автор: rodendron 26.4.2005, 18:29
В индексах все поля, которые участвуют в запросе.

С запросом более менее разобрался.

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

Но все равно - я на своем компе ощущаю небольшую разницу, оба долго.
А у друга - в phpmyadmin - 10 секунд. Через WWW - 5 минут.
Что посоветуете сделать?
Заранее благодарен за ответ.

Автор: Opik 26.4.2005, 18:39
покажи, как ты на страничке выполняешь запрос?

Автор: rodendron 26.4.2005, 23:35
Код

$r = mysql_query("$sql");

if($check != '') {
echo "<TABLE border=1>";
echo "<TR><TD>Код грузополучателя</TD><TD>Имя грузополучателя</TD><TD>Код грузоотправителя</TD><TD>Имя грузоотправителя</TD><TD>Станция</TD><TD>Инвентарный номер вагона</TD><TD>Вес груза</TD><TD>Дата</TD></TR>";
for($i=0; $i<mysql_num_rows($r); $i++)
{
  $f=mysql_fetch_array($r);
  echo "<TR><TD>{$f['KGPN']}</TD>";
  echo "<TD>{$f['GPN']}</TD>";
  echo "<TD>{$f['GROTN']}</TD>";
  echo "<TD>{$f['GON']}</TD>";
  echo "<TD>{$f['STNMN']}</TD>";
  echo "<TD>{$f['NVN']}</TD>";
  echo "<TD>{$f['QGVN']}</TD>";
  echo "<TD>{$f['DATN']}</TD></TR>";
}
echo "</TABLE>";

Автор: Mal Hack 27.4.2005, 10:21
Цитата
for($i=0; $i<mysql_num_rows($r); $i++)
{
  $f=mysql_fetch_array($r);
  echo "<TR><TD>{$f['KGPN']}</TD>";
  echo "<TD>{$f['GPN']}</TD>";
  echo "<TD>{$f['GROTN']}</TD>";
  echo "<TD>{$f['GON']}</TD>";
  echo "<TD>{$f['STNMN']}</TD>";
  echo "<TD>{$f['NVN']}</TD>";
  echo "<TD>{$f['QGVN']}</TD>";
  echo "<TD>{$f['DATN']}</TD></TR>";
}

Заменяем на:
Код
$s = "";
 while( $f = mysql_fetch_assoc( $r ) )
 { $str .= "<TR><TD>{$f['KGPN']}</TD><TD>{$f['GPN']}</TD><TD>{$f['GROTN']}</TD><TD>{$f['GON']}</TD><TD>{$f['STNMN']}</TD><TD>{$f['NVN']}</TD><TD>{$f['QGVN']}</TD><TD>{$f['DATN']}</TD></TR>"; } 
print $str;

Автор: Kud 2.5.2005, 19:40
Цитата(rodendron @ 26.4.2005, 17:29)
И еще - создается впечатление, что запрос начинает все дольше и дольше обрабатываться при все новом и новом запросе. То есть - чем больше раз его запускаешь. - Тем дольше. Такое может быть? Или это просто кажется?

Скорее всего БД еще не освободила ресурсы с прошлого запроса а т.к. ты говоришь, что она большая (таблица) то ей (базе) приходется "ложиться" в своп, для хранения и прошлого и нового резалта.

Цитата(Mal @ 27.4.2005, 09:21)
for($i=0; $i<mysql_num_rows($r); $i++)
{
  $f=mysql_fetch_array($r);
....

Такого рода циклы я уже давно отучил себя писать, ибо сильно уж грузит этот mysql_num_rows() а т.к. у тебя строк дофига то он и вызывается дофига раз.

Вот кстати: думаю поймешь почему тормозило =) накидай на досуге ....
Код

<pre>
<?
 function check($v)
 {
  echo ' -->'.$v."\n";
  return 10;
 }
 
 $q = 'go to check';
 
 for ($i=0;$i<check($q);$i++)
  echo $i."\n";
?>
</pre>

Автор: rodendron 4.5.2005, 22:57
Kud, твой код, это как я понял просто пример долгой работы вызова функции?
Добавлено @ 22:58
И в этом вопросе лучше работает:
Код

 while( $f = mysql_fetch_assoc( $r ) )

Добавлено @ 22:59
?
забыл знак вопроса добавить smile

Автор: Mal Hack 4.5.2005, 23:02
Цитата(rodendron @ 4.5.2005, 23:57)
И в этом вопросе лучше работает:

Да.

Автор: oxygen 5.5.2005, 02:19
кстати как вариант - сделать свертки нужных полей в отдельные таблицы. Что-то типа кэша. Информация будет дублироваться, размер базы расти, но это не так критично как скорость SQL. В свое время мне это здорово помогло.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)