|
|
|
| Доброго времени суток! Есть такой вопросик.
Как лучше с точки зрения производительности написать процедуру?
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 будет приведение к типу) и, главное, входной параметр не попадет в сам запрос... он лишь управляющее звено.....
В общем главный вопрос.... НАСКОЛЬКО ПЕРВЫЙ ВАРИАНТ ОТРАЗИТСЯ НА СКОРОСТИ? | |
|
|
|
|
|
|
|
для: jonik
(23.09.2011 в 13:15)
| | Ника не отразится, если вы воспользуетесь одни оператором IF, а остальные блоки оформите как IFELSE, а еще лучше воспользуетесь оператором CASE. | |
|
|
|
|
|
|
|
для: cheops
(23.09.2011 в 14:00)
| | Cпасибки..... Значит не стоит бояться коротких строковых операций. Но тогда вопрос в догонку)))
Выбор между
1. Подзапрос
2. Временная таблица
3. Объединение
По собственным эксперементам я понял, что подзапрос - это вложенный цикл... и если во внутреннем запросе перебирается много записей - то работа дико тормозится..... Посему подзапросы использую только на небольших таблицах.....
А вот как быть с выбором между объединением или временнной таблицей....... Напрмиер что сильнее тормозит при объединении - большое количество объединяемых таблиц или количество записей в них?... и вообще рекомендуете ли вы использовать временные таблицы (естественно мемоrу)? или есть подводные камни? | |
|
|
|
|
|
|
|
для: jonik
(23.09.2011 в 14:17)
| | Под временной таблицей что имеется в виду? Ведь и объединения тоже зачастую используют временные таблицы, если они не большие, то в оперативной памяти, если большие - то на жестком диске. | |
|
|
|
|
|
|
|
для: 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-х таблиц, начинает дико захлебываться и тормозить...... | |
|
|
|
|
|
|
|
для: jonik
(23.09.2011 в 15:04)
| | Зависит от индексации, может и не тормозить, если ей удасться воспользоваться индексами. Если во временной таблице будет одна запись, возможно это лучший вариант, с другой стороны - это зависит от количества запросов в секунду, как бы не поплатиться за это потерей слишком большого количества оперативной памяти. | |
|
|
|