[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Совершенствуем запрос к БД
@dmir@l
Всем привет!

Решил усовершенствовать свой запрос на выборку данных из БД.
Вот он примитивный код с несложной проверкой.

$sql = mysql_query("Select * from table",$db);

if(!$sql)
{
echo "<p>Выборка данных не произведена. Сообщите админу код ошибки:</p>";
exit(mysql_error());
}
if(mysql_num_rows($sql) > 0)
{
$myrow = mysql_fetch_array($sql);
}
else
{
echo "<p>База данных пустая!</p>";
exit();
}


Можно ли как то усовершенстовать данный примитив, если да, то как и желательно ссылочку на статью, на литературу.

Заранее спасибо!



Спустя 2 минуты, 14 секунд (31.01.2011 - 16:08) Snus написал(а):
$query = "Select * from `table`";
$sql = mysql_query($query, $db) or die('<p>Выборка данных не произведена. Сообщите админу код ошибки:</p>'.mysql_error());
while ( $myrow = mysql_fetch_assoc($sql) ){
...
}

Спустя 2 минуты, 47 секунд (31.01.2011 - 16:11) @dmir@l написал(а):
+1 тема закрыта

Спустя 24 минуты, 42 секунды (31.01.2011 - 16:36) inpost написал(а):
@dmir@l
Оставь if(mysql_num_rows($sql) > 0), запись эта пригодится. Хочешь усовершенствовать, вместо * запиши все имена таблиц.

Спустя 14 минут, 51 секунда (31.01.2011 - 16:51) Snus написал(а):
inpost
А я бы сделал так

$query = "Select * from `table`";
$sql = mysql_query($query, $db) or die('<p>Выборка данных не произведена. Сообщите админу код ошибки:</p>'.mysql_error());
$i = 0;
while ( $myrow = mysql_fetch_assoc($sql) ){
$i++;
...

}

if($i == 0) die('Пусто');


Спустя 2 минуты, 10 секунд (31.01.2011 - 16:53) linker написал(а):
Snus
Я бы так не делал.

Спустя 1 минута, 19 секунд (31.01.2011 - 16:54) Snus написал(а):
linker
Сколько людей - столько мнений. Мне вариант с mysql_num_rows не нравится.

Спустя 5 минут, 51 секунда (31.01.2011 - 17:00) linker написал(а):
Snus
Почему? smile.gif

Спустя 7 минут, 3 секунды (31.01.2011 - 17:07) Snus написал(а):
linker
А ты подумай логически. Ты предлагаешь считать строки из запроса, не зависимо пустой результат вернула БД или нет. А потом проверку проводить. Лишний процесс. Я предложил вариант более оптимальный. Передвигаем бегунок $i только в том случае, если БД вернула не пустой результат. А дальше проверяет $i, если 0 - значит никаких данных нет.

Спустя 7 минут, 23 секунды (31.01.2011 - 17:14) linker написал(а):
Snus
Да, но если результат вернул 10 строк или больше? Каждая итерация цикла будет медленнее на время $i ++, что в совокупности даст задержку T(i) * n. По-моему, это несколько расточительно.

Спустя 6 минут, 39 секунд (31.01.2011 - 17:21) Snus написал(а):
linker
Я же говорю - сколько людей - столько мнений. Можно подумать, что mysql_num_rows не затрачивает времени.

Спустя 5 минут, 16 секунд (31.01.2011 - 17:26) linker написал(а):
Snus
Затрачивает конечно, но только один раз не зависимо от количества строк в возвращаемом результате.

Спустя 11 минут, 2 секунды (31.01.2011 - 17:37) Dron19 написал(а):
Цитата (linker @ 31.01.2011 - 14:26)
Snus
Затрачивает конечно, но только один раз не зависимо от количества строк в возвращаемом результате.

Snus, правду говорят...

Спустя 8 минут, 1 секунда (31.01.2011 - 17:45) Snus написал(а):
linker
Dron19
Вы реальные цифры говорите, а не с потолка!
Вот вам пример реальный

$start = microtime(1);

$query = "SELECT * FROM `doc`.`db_risk` LIMIT 50000";

$sql = mysql_query($query) or die(mysql_error());
$cnt = mysql_num_rows($sql);
while ( $row = mysql_fetch_assoc($sql) ){

}


echo '<p>'.$cnt.'<p>';
$end = microtime(1) - $start;
echo '<p>'.$end.'</p>';

$start = microtime(1);

$sql = mysql_query($query) or die(mysql_error());
$i = 0;
while ( $row = mysql_fetch_assoc($sql) ){
$i++;
}


echo '<p>'.$i.'</p>';
$end = microtime(1) - $start;
echo '<p>'.$end.'</p>';


Вот результат

50000

0.18717694282532

50000

0.18670797348022

Спустя 47 секунд (31.01.2011 - 17:46) linker написал(а):
Здесь еще есть один плюс - ты знаешь количество возвращенных строк еще до входа в цикл.

Спустя 2 минуты, 59 секунд (31.01.2011 - 17:49) Snus написал(а):
Вот тоже самое только LIMIT 100


100

0.00047802925109863

100

0.00037693977355957

Спустя 32 секунды (31.01.2011 - 17:50) Snus написал(а):
linker
А зачем?

Спустя 5 минут, 23 секунды (31.01.2011 - 17:55) Dron19 написал(а):
Интересно, а зачем ты цикл сделал проверяя mysql_num_rows, она тебе и так вернет результат, а во втором случае ты без него не посчитаешь? Скажи зачем ? smile.gif

Спустя 3 минуты, 54 секунды (31.01.2011 - 17:59) Snus написал(а):
Dron19
М-да )

Спустя 4 минуты, 6 секунд (31.01.2011 - 18:03) Dron19 написал(а):
Цитата (Snus @ 31.01.2011 - 14:59)
Dron19
М-да )

что м-да? smile.gif Ты же проверяешь сколько получилось строк, а в первом варианте mysql_num_rows тебе без цикла посчитает, так что не мдакай smile.gif . В одном ты точно прав, сколько людей, столько и мнений

Спустя 6 минут, 57 секунд (31.01.2011 - 18:10) Snus написал(а):
Dron19
Автору нужно было вывести данные из БД, но в случае, если таблица пуста - вывести сообщение об этом. Вот я на основании этого пример привел. А ты говоришь про подсчет строк.

Спустя 1 минута, 16 секунд (31.01.2011 - 18:11) Dron19 написал(а):
у тебя же тема зашла про подсчет строк, вот я и сказал, потому что там не нужен цикл

Спустя 2 минуты, 40 секунд (31.01.2011 - 18:14) @dmir@l написал(а):
мда)) так что посоветуете новичку??? biggrin.gif мне с пояснениями желательно)))

так чтобы по простому, например:

запрос, если жива либо есть строки и результат тру, то в значение переменной кидаем весь результат как массив.) но так чтобы было понятно, и желательно покороче, попроще, не так как у меня)

Спустя 27 секунд (31.01.2011 - 18:14) Snus написал(а):
Dron19
Вот поэтому и написал М-да. Прочитай внимательно еще раз. Вопрос был использовать
if($i == 0) die('Пусто');

или
mysql_num_rows($sql);

Спустя 3 минуты, 40 секунд (31.01.2011 - 18:18) @dmir@l написал(а):
насколько я понимаю если мы используем mysql_num_rows($sql); то результ будет возвращать тру даже если внутри пустота?


Спустя 1 минута, 54 секунды (31.01.2011 - 18:20) Snus написал(а):
@dmir@l
mysql_num_rows($sql) вернет значение 0

Спустя 6 минут, 28 секунд (31.01.2011 - 18:26) @dmir@l написал(а):
Snus я понял!

я забиваю базу пустыми данными, mysql_num_rows($sql) возвращает мне 1 строку.
1 строка с пустыми данными.

Значит условие истина, выборка пошла..))здорово

Спустя 1 минута, 38 секунд (31.01.2011 - 18:28) Snus написал(а):
@dmir@l
Нет, mysql_num_rows($sql) считает кол-во строк из результата запроса mysql_query()

Спустя 12 минут, 45 секунд (31.01.2011 - 18:41) @dmir@l написал(а):
а я могу написать таким образом:


<?php 
$query = 'Select id,money oplata';
$sql = mysql_query($query,$db) or die('<p>База данных пустая!</p>');
if (mysql_num_rows($sql) > 0)
{
echo mysql_result($sql,1,2);
}
?>

Спустя 2 минуты, 46 секунд (31.01.2011 - 18:44) Snus написал(а):
@dmir@l
Конечно можешь, только работать этот кусок кода у тебя не будет.

Спустя 2 минуты (31.01.2011 - 18:46) @dmir@l написал(а):
Snus
Почему?

Спустя 3 минуты, 43 секунды (31.01.2011 - 18:49) Snus написал(а):
@dmir@l
$query = "SELECT `id`, `money` FROM `oplata`";

mysql_query($query) or die('<p>База данных пустая!</p>');
mysql_query выполняет запрос, а не проверяет на "заполненность"

Спустя 40 секунд (31.01.2011 - 18:50) @dmir@l написал(а):
посоветуйте статьи, сайт, почитать про выборку данных из БД

Спустя 47 секунд (31.01.2011 - 18:51) @dmir@l написал(а):
ок я понял! спасибо!

Спустя 3 минуты, 8 секунд (31.01.2011 - 18:54) Dron19 написал(а):
Snus, значит я тебя не так понял, я на своей волне был wink.gif

Спустя 3 часа, 32 минуты, 26 секунд (31.01.2011 - 22:26) inpost написал(а):
@dmir@l
mysql.ru

Спустя 1 час, 20 минут, 15 секунд (31.01.2011 - 23:47) linker написал(а):
Snus
Твой тест невалидный. Моя метода. Создаем два скрипта:


a.php(мой вариант)
<?php
function
microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}

$h = mysql_connect('localhost', '', '');
mysql_select_db('pdfio3', $h);
$r = mysql_query("SELECT * FROM `sys_users`");
$s = microtime_float();
$c = mysql_num_rows($r);
while($d = mysql_fetch_assoc($r)) {}
$e = microtime_float();
echo ($e - $s) . " sec.";

?>
и второй
b.php(твой вариант)
<?php
function
microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}

$h = mysql_connect('localhost', '', '');
mysql_select_db('pdfio3', $h);
$r = mysql_query("SELECT * FROM `con_costs`");
$s = microtime_float();
$i = 0;
while($d = mysql_fetch_assoc($r)) { $i ++; }
$e = microtime_float();
echo ($e - $s) . "sec";

?>
Записей в таблице почти 23 тысячи. Запускаем два скрипта по несколько раз и получаем средний
a.php - 0.0041739940643311 sec.
b.php - 0.082695007324219 sec.
как говорится почувствуй разницу.

Спустя 13 часов, 31 минута, 38 секунд (1.02.2011 - 13:18) Snus написал(а):
linker
Ты забыл уточнить сколько у тебя данных в таблице sys_users и con_costs. Чтобы было справедливо делай выборку из одной и той же таблицы sys_users. Жду результатов. Потом покажу свои результаты.

Спустя 12 минут, 6 секунд (1.02.2011 - 13:30) Snus написал(а):
По твоим "валидным" методам результаты:

test.php

<?php

function
microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
};

mysql_connect('xxx','xxx','xxx');
mysql_set_charset('utf8');

$query = "SELECT * FROM `doc`.`db_risk` LIMIT 50000";

$s = microtime_float();

$sql = mysql_query($query) or die(mysql_error());
$cnt = mysql_num_rows($sql);
while ( $row = mysql_fetch_assoc($sql) ){

}


echo '<p>'.$cnt.'<p>';
$e = microtime_float();
echo '<p>'.($e-$s).'</p>';

?>



50000

0.17970204353333




test2.php

<?php

function
microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
};

mysql_connect('xxx','xxx','xxx');
mysql_set_charset('utf8');

$query = "SELECT * FROM `doc`.`db_risk` LIMIT 50000";

$s = microtime_float();

$i = 0;
$sql = mysql_query($query) or die(mysql_error());
while ( $row = mysql_fetch_assoc($sql) ){
$i++;
}


echo '<p>'.$i.'</p>';
$e = microtime_float();
echo '<p>'.($e-$s).'</p>';

?>


50000

0.16882801055908


Вот и думай.

Спустя 7 минут, 57 секунд (1.02.2011 - 13:38) Snus написал(а):
linker
И твой любимый mysql_num_rows() не покажет результатов, если выполнить mysql_unbuffered_query(). А для экономии памяти иногда приходится выполнять подобные запросы. Ты все еще будешь настаивать на преимуществах mysql_num_rows() ?

Спустя 54 минуты, 10 секунд (1.02.2011 - 14:32) linker написал(а):
Прошу прощения, там в обоих примерах `con_costs`, не то скопипастил (тестировал на двух таблицах). В ней 23 тысячи записей.

Про mysql_unbuffered_query() конечно mysql_num_rows() тут не поможет, но и тут есть свои минусы. Предлагаю провести тут опрос, кто и как часто использует mysql_unbuffered_query(), думаю результат известен заранее.

Спустя 1 час, 16 минут, 59 секунд (1.02.2011 - 15:49) Snus написал(а):
linker
Еще раз проверь свои результат. Они у тебя явно врут.

Спустя 1 месяц, 15 дней, 7 часов, 1 минута, 31 секунда (16.03.2011 - 22:51) alex12060 написал(а):
Я не понимаю, какая разница?

Снус, ты в своем начале просто создаешь в обоих случаях переменную неизвестного типа - память+время.

Цикл просчитал, и после этого, проврил результат, если нет ничего - фигня.

А значение кол-ва строк проще так проверить if (mnr == 0) die()

Все здесь упирается в написание кода.

Но все-же, твои результаты для меня - носенс.


_____________
=)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.