Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как лучше написать процедуру?
 
 автор: jonik   (23.09.2011 в 13:15)   письмо автору
 
 

Доброго времени суток! Есть такой вопросик.
Как лучше с точки зрения производительности написать процедуру?

1 ВАРИАНТ

Greate procedure select (in var int)
begin
declare condition text default '';

if var=1 then
set condition='AND какое-то условие ';

end if;

if var=2 then
set condition='AND какое-то другое условие условие ';

end if;

if var=3 then

set condition='AND какое-то третье условие ';
end if;



set @query=concat("select field1, field2 from table where обязательное условие", condition, " ");

prepare query from @query;

execute query;




2 ВАРИАНТ

Greate procedure select (in var int)

begin

if var<>1 and var<>2 and var<>3 then
select field1, field2 from table where обязательное условие;

else
if var=1 then

select field1, field2 from table where обязательное условие, and еще условие;

end if;

if var=2 then

select field1, field2 from table where обязательное условие, and какое-то другое условие условие;

end if;


if var=3 then

select field1, field2 from table where обязательное условие, and какое-то третье условие;

end if;
end if;



При малом количестве вариантов, очевидно, что 2-й вариант лучше.... но.... когда входной параметр может принимать много значений, или входных параметров может быть много и могут образовываться различные комбинации и, если под каждый вариант писать полностью запрос, то процедура станет чудовищно громадной..... С другой стороны... насколько работа со строками (как в первом варианте) отражается на производительности и насколько это вообще правильно так делать?... Скажу сразу.. с безопасностью будет все ОК и SQL Injection не пройдет, т.к. входной параметр будет цифра (в PHP будет приведение к типу) и, главное, входной параметр не попадет в сам запрос... он лишь управляющее звено.....
В общем главный вопрос.... НАСКОЛЬКО ПЕРВЫЙ ВАРИАНТ ОТРАЗИТСЯ НА СКОРОСТИ?

  Ответить  
 
 автор: cheops   (23.09.2011 в 14:00)   письмо автору
 
   для: jonik   (23.09.2011 в 13:15)
 

Ника не отразится, если вы воспользуетесь одни оператором IF, а остальные блоки оформите как IFELSE, а еще лучше воспользуетесь оператором CASE.

  Ответить  
 
 автор: jonik   (23.09.2011 в 14:17)   письмо автору
 
   для: cheops   (23.09.2011 в 14:00)
 

Cпасибки..... Значит не стоит бояться коротких строковых операций. Но тогда вопрос в догонку)))

Выбор между

1. Подзапрос
2. Временная таблица
3. Объединение

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

А вот как быть с выбором между объединением или временнной таблицей....... Напрмиер что сильнее тормозит при объединении - большое количество объединяемых таблиц или количество записей в них?... и вообще рекомендуете ли вы использовать временные таблицы (естественно мемоrу)? или есть подводные камни?

  Ответить  
 
 автор: cheops   (23.09.2011 в 14:48)   письмо автору
 
   для: jonik   (23.09.2011 в 14:17)
 

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

  Ответить  
 
 автор: jonik   (23.09.2011 в 15:04)   письмо автору
 
   для: cheops   (23.09.2011 в 14:48)
 

Под временной таблицей имеется ввиду Create temporary table в которую заносятся какие-либо промежуточные данные.... вот простой пример.....

Есть 2 большие таблицы.. скажем по 1 млн. записей в каждой, а итоговую выборку попадут очень мало записей..

Users Просто таблица

id name id depart
1 Петя 1 47
2 Вася 34 938456
3 Ваня 43 66

Самый простой и понятный код будет такой....
Select name from users where id in (select id from просто таблица where depart=47);

По написанию запрос прост, но тормозить будет жутко (у нас по миллиону записей в каждой таблице)

можно сделать так....
drop temporary table if exists tempp
Create temporary table tempp select id from просто таблица where depart=47;
select name from users where id in (select * from tempp);


а можно вот так::

select users.name from users inner join просто таблица on users.id=просто тбалица.id where просто таблица.depart=47;


какой вариант предпочтительнее?.....
Дело в том, что я слышал байку (а может и не байка?), что mysql при объединении более 3 или 4-х таблиц, начинает дико захлебываться и тормозить......

  Ответить  
 
 автор: cheops   (23.09.2011 в 17:05)   письмо автору
 
   для: jonik   (23.09.2011 в 15:04)
 

Зависит от индексации, может и не тормозить, если ей удасться воспользоваться индексами. Если во временной таблице будет одна запись, возможно это лучший вариант, с другой стороны - это зависит от количества запросов в секунду, как бы не поплатиться за это потерей слишком большого количества оперативной памяти.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования