Например есть таблица test в ней существует колонка id
Нужно выбрать все строки из таблици test значения id которых равно 3, 6 или 10
Вот как будет быстрее
$id = 12;
$query = mysql_query("SELECT * FROM `test` WHERE `ref` = '" . $id . "' AND ((`id` = 3) or (`id` = 6) or (`id` = 10))");
while($array = mysql_fetch_array($query)){
echo $array['name'];
}
или так
$id = 12;
$query = mysql_query("SELECT * FROM `test` WHERE `ref` = '" . $id . "'");
while($array = mysql_fetch_array($query)){
if($array['id'] == 3 || $array['id'] == 6 || $array['id'] == 10)
echo $array['name'];
}
Ну вот суть вопроса вроде изложил верно :)
Спустя 4 минуты, 12 секунд (26.02.2011 - 13:54) alex12060 написал(а):
Первый вариант быстрее, так как он выберет определенные результаты из БД.
А 2 вариант вытаскивает все, но потом только ищет.
Хотя, сэкономленная скорость будет мизерной.
А 2 вариант вытаскивает все, но потом только ищет.
Хотя, сэкономленная скорость будет мизерной.
Спустя 5 минут, 56 секунд (26.02.2011 - 14:00) Dron19 написал(а):
alex12060, а вот мне интересно, как ты это узнал?
Так не делается, берешь и считаешь программно... А потом уже делаешь выводы

Спустя 3 минуты, 39 секунд (26.02.2011 - 14:04) Dron19 написал(а):
<?php
$t = microtime(1);
$id = 12;
$query = mysql_query("SELECT * FROM `test` WHERE `ref` = '" . $id . "' AND ((`id` = 3) or (`id` = 6) or (`id` = 10))");
while($array = mysql_fetch_array($query)){
echo $array['name'];
}
echo microtime(1) - $t . '<br>';
$t = microtime(1);
$id = 12;
$query = mysql_query("SELECT * FROM `test` WHERE `ref` = '" . $id . "'");
while($array = mysql_fetch_array($query)){
if($array['id'] == 3 || $array['id'] == 6 || $array['id'] == 10)
echo $array['name'];
}
echo microtime(1) - $t;
?>
Выведутся два числа, какое число меньше, сам понимаешь, тот вариант и быстрей
Спустя 3 минуты, 35 секунд (26.02.2011 - 14:07) alex12060 написал(а):
ща профиксим твой вариант подсчета и узнаем, был ли я прав, али нет)
Спустя 46 секунд (26.02.2011 - 14:08) dsa написал(а):
alex12060
понятно я тоже больше склонялся к первому варианту просто терзали некоторые сомнения
а на счет того что будет ли сэкономленная скорость будет мизерной или нет во втором случае мне кажется будет зависеть от того сколько строк попадет в цикл while ...
понятно я тоже больше склонялся к первому варианту просто терзали некоторые сомнения

а на счет того что будет ли сэкономленная скорость будет мизерной или нет во втором случае мне кажется будет зависеть от того сколько строк попадет в цикл while ...
Спустя 1 минута, 58 секунд (26.02.2011 - 14:10) dsa написал(а):
Цитата (alex12060 @ 26.02.2011 - 11:07) |
ща профиксим твой вариант подсчета и узнаем, был ли я прав, али нет) |
угу ждем

Спустя 39 секунд (26.02.2011 - 14:11) Dron19 написал(а):
Цитата (alex12060 @ 26.02.2011 - 11:07) |
ща профиксим твой вариант подсчета и узнаем, был ли я прав, али нет) |
да я тебе еще раз говорю, так не делается, все должно проверяться, PHP все-таки написан на С, а значит разработчики могли написать разные варианты решения задачи, что означает, что так судить нельзя, в данном случае, нужно либо знать, либо проверять
Спустя 1 минута, 13 секунд (26.02.2011 - 14:12) Dron19 написал(а):
для этого нужно иметь не маленький объем этих таблиц, что бы увидеть разницу в выполнении
Спустя 3 минуты, 51 секунда (26.02.2011 - 14:16) dsa написал(а):
Цитата (Dron19 @ 26.02.2011 - 11:12) |
для этого нужно иметь не маленький объем этих таблиц, что бы увидеть разницу в выполнении |
вот я почему и спрашиваю

Спустя 3 минуты, 45 секунд (26.02.2011 - 14:20) Dron19 написал(а):
а ты и так можешь проверить, код я тебе дал
alex12060, приду и посмотрю на результаты, я офф
alex12060, приду и посмотрю на результаты, я офф
Спустя 28 секунд (26.02.2011 - 14:20) alex12060 написал(а):
Дрон, я не дурак)
Я наплодил 3000 строк.
Я наплодил 3000 строк.
Спустя 52 минуты, 51 секунда (26.02.2011 - 15:13) dsa написал(а):
Все верно 1 вариант работает во много раз быстрее
//0.00152897834778 - вариант 1
//0.0931010246277 - вариант 2
проверял на 200000 строк
//0.00152897834778 - вариант 1
//0.0931010246277 - вариант 2
проверял на 200000 строк
Спустя 48 минут, 15 секунд (26.02.2011 - 16:01) inpost написал(а):
if($array['id'] == 3 || $array['id'] == 6 || $array['id'] == 10) - данная проверка очень медленная, тот же пример с readdir, мы получим "." и "..", если делаем так:
то он в несколько раз медленее, чем: unset($arr[0]);unset($arr[1]); в самом начале, а вести дальнейшую операцию непосредственно с ними.
dsa
Есть кеширование данных, особенно по ключам, где у тебя `id` на 99% является первичным ключем, поэтому выборка в БД в много раз будет быстрее.
if($arr != '.' || $arr != '..')
echo 'text';
то он в несколько раз медленее, чем: unset($arr[0]);unset($arr[1]); в самом начале, а вести дальнейшую операцию непосредственно с ними.
dsa
Есть кеширование данных, особенно по ключам, где у тебя `id` на 99% является первичным ключем, поэтому выборка в БД в много раз будет быстрее.
Спустя 52 минуты, 33 секунды (26.02.2011 - 16:54) dsa написал(а):
Цитата (inpost @ 26.02.2011 - 13:01) |
if($array['id'] == 3 || $array['id'] == 6 || $array['id'] == 10) - данная проверка очень медленная, тот же пример с readdir, мы получим "." и "..", если делаем так:if($arr != '.' || $arr != '..') то он в несколько раз медленее, чем: unset($arr[0]);unset($arr[1]); в самом начале, а вести дальнейшую операцию непосредственно с ними. |
Извени чего-то не догнал если мы уничтожим $arr[0] в начале цила то как же мы будем с ним потом работать?
Спустя 17 минут, 55 секунд (26.02.2011 - 17:12) Michael написал(а):
dsa, второй вариант у тебя просто неверен. Ты берешь из БД ВСЕ и начинаешь выбирать на php. А БД как раз созданы чтобы выбрать именно то, что тебе надо.
Лучше в этом случае без OR:
Лучше в этом случае без OR:
AND `id` IN (3, 6, 10)
Спустя 10 минут, 51 секунда (26.02.2011 - 17:23) dsa написал(а):
Цитата (Michael @ 26.02.2011 - 14:12) |
dsa, Лучше в этом случае без OR: AND `id` IN (3, 6, 10) |
это будет аналогично or?
Спустя 1 час, 4 секунды (26.02.2011 - 18:23) Dron19 написал(а):
Цитата (dsa @ 26.02.2011 - 12:13) |
Все верно 1 вариант работает во много раз быстрее //0.00152897834778 - вариант 1 //0.0931010246277 - вариант 2 проверял на 200000 строк |
ВОТ
