[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: оператор "or" в запросах
dsa
В общем меня интересует лишь такой вопрос влияет ли оператор "or" на скорость выполнения зпророса в mysql
Например есть таблица 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 вариант вытаскивает все, но потом только ищет.

Хотя, сэкономленная скорость будет мизерной.

Спустя 5 минут, 56 секунд (26.02.2011 - 14:00) Dron19 написал(а):
alex12060, а вот мне интересно, как ты это узнал? smile.gif Так не делается, берешь и считаешь программно... А потом уже делаешь выводы

Спустя 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
понятно я тоже больше склонялся к первому варианту просто терзали некоторые сомнения smile.gif
а на счет того что будет ли сэкономленная скорость будет мизерной или нет во втором случае мне кажется будет зависеть от того сколько строк попадет в цикл while ...

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

угу ждем smile.gif

Спустя 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)
для этого нужно иметь не маленький объем этих таблиц, что бы увидеть разницу в выполнении

вот я почему и спрашиваю smile.gif еслиб у меня в тех таблицах было хотяб по 100000 записей то яб сам проверил

Спустя 3 минуты, 45 секунд (26.02.2011 - 14:20) Dron19 написал(а):
а ты и так можешь проверить, код я тебе дал
alex12060, приду и посмотрю на результаты, я офф

Спустя 28 секунд (26.02.2011 - 14:20) alex12060 написал(а):
Дрон, я не дурак)
Я наплодил 3000 строк.

Спустя 52 минуты, 51 секунда (26.02.2011 - 15:13) dsa написал(а):
Все верно 1 вариант работает во много раз быстрее
//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, мы получим "." и "..", если делаем так:
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 != '..')
echo 'text';

то он в несколько раз медленее, чем: unset($arr[0]);unset($arr[1]); в самом начале, а вести дальнейшую операцию непосредственно с ними.

Извени чего-то не догнал если мы уничтожим $arr[0] в начале цила то как же мы будем с ним потом работать?

Спустя 17 минут, 55 секунд (26.02.2011 - 17:12) Michael написал(а):
dsa, второй вариант у тебя просто неверен. Ты берешь из БД ВСЕ и начинаешь выбирать на php. А БД как раз созданы чтобы выбрать именно то, что тебе надо.
Лучше в этом случае без 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 строк

ВОТ wink.gif Да и вообще, второй вариант очень плохо решает проблему, а первый сразу вытащит нужные данные
Быстрый ответ:

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