SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.02.2012 21:24:26

soln
Участник
Зарегистрирован: 07.02.2012
Сообщений: 3

Оптимизировавший запрос вместо цикла?

Приветствую.
не подскажете?

Есть python скрипт который активно общается с  БД mysql. В скрипте есть цикл который генерит следующий sql запрос:

Код:

insert into diff (serverid, ipsw, port, idsw) values ("2" , "10.90.0.5", "19", "20");

Дело в том за один цикл меняется только значение ports (это диапозон цифр от  1 до 10 или 1 до 26 или от 1 до 28) все остальное же  в пределах одного цикла не меняется.  То есть на выходе имеем

Код:

         1 | 10.90.0.2  |    1 |    |      | NULL |     |           0 |          |    1 |
|        1 | 10.90.0.2  |    2 |    |      | NULL |     |           0 |          |    1 |
|        1 | 10.90.0.2  |    3 |    |      | NULL |     |           0 |          |    1 |
|        1 | 10.90.0.2  |    4 |    |      | NULL |     |           0 |          |    1 |
|        1 | 10.90.0.2  |    5 |    |      | NULL |     |           0 |          |    1 |
|        1 | 10.90.0.2  |    6 |    |      | NULL |     |           0 |          |    1 |
|        1 | 10.90.0.2  |    7 |    |      | NULL |     |           0 |          |    1 |
|        1 | 10.90.0.2  |    8 |    |      | NULL |     |           0 |          |    1 |
|        1 | 10.90.0.2  |    9 |    |      | NULL |     |           0 |          |    1 |
|        1 | 10.90.0.2  |   10 |    |      | NULL |     |           0 |          |    1 |
|        1 | 10.90.0.2  |   11 |    |      | NULL |     |           0 |          |    1 |
...
|        1 | 10.90.0.2  |   25 |    |      | NULL |     |           0 |          |    1 |
|        1 | 10.90.0.2  |   26 |    |      | NULL |     |           0 |          |    1 |

Вопрос нельзя ли как то это все запихнуть в один запрос.
Фантазируя:

insert into diff (serverid, ipsw, port, idsw) values ("2" , "10.90.0.5", [1-26], "20");

Ps Сразу скажу что sql знаю лишь в прикладной манере... То есть  когда надо использую справочник и google. По сему если возможно особо не пинать.

Неактивен

 

#2 07.02.2012 21:36:33

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Оптимизировавший запрос вместо цикла?

Здравствуйте. Циклов в MySQL нету. Но можно создать пользовательскую функцию, в которой этот цикл (через loop) и организовать. Вот здесь пример функции - она другое делает, но цикл там тоже есть.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 07.02.2012 22:03:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Оптимизировавший запрос вместо цикла?

insert into diff (serverid, ipsw, port, idsw) values ("2" , "10.90.0.5", 1, "20"),("2" , "10.90.0.5", 2, "20"),...,("2" , "10.90.0.5", 26, "20");

А какой тип данных вы используете для хранения serverid? Если числовой, то зачем передавать значение как строку?

Неактивен

 

#4 08.02.2012 13:43:45

soln
Участник
Зарегистрирован: 07.02.2012
Сообщений: 3

Re: Оптимизировавший запрос вместо цикла?

Прежде всего спасибо Вам за ответ.


deadka написал:

... Но можно создать пользовательскую функцию, в которой этот цикл (через loop) и организовать.

Спасибо. Просмотрел глазами, положил в закладки, интересно. Одно я не уверен что такой подход приемлем в моем случае.
Первоначальная задача состоит в уменьшении времени работы питоновского скрипта путем уменьшением количества запросов к sql, Более менее прозрачным (преемственным) способом. 


vasya написал:

А какой тип данных вы используете для хранения serverid? Если числовой, то зачем передавать значение как строку?

Да вот именно это я искал спасибо, Работа скрипта уменьшилась ~ 13 раз!!! 
Спасибо большое!!!
Для serverid используется int(5).  Ну дело в том что значение serverid я получаю из другой БД,  забирая одним массивом все данные а там и числа и строки.  Можно конечно когда массив парсится перевести  числовые в int но смысл? Дополнительное действие.

Неактивен

 

#5 08.02.2012 14:33:08

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Оптимизировавший запрос вместо цикла?

soln написал:

Для serverid используется int(5).  Ну дело в том что значение serverid я получаю из другой БД,  забирая одним массивом все данные а там и числа и строки.  Можно конечно когда массив парсится перевести  числовые в int но смысл? Дополнительное действие.

Дурной тон  hmm
В данном случае это действие производит база. И для базы это большие затраты, даже в лучшем случае ей ещё предупреждения писать (а если ещё учесть что работа базы и так, как правило, самое узкое место...). Кроме того работа вашего скрипта становится зависимой от настроек базы.

mysql> select @@sql_mode;
+----------------------------------------------------------------+
| @@sql_mode                                                     |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> create table test (ids int);
Query OK, 0 rows affected (0.22 sec)

mysql> insert into test values('aa');
ERROR 1366 (HY000): Incorrect integer value: 'aa' for column 'ids' at row 1
mysql> set @@sql_mode='';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test values('aa');
Query OK, 1 row affected, 1 warning (0.13 sec)


Что касается int(5), то есть подозрение, что можно обойтись smallint, а это 2 байта вместо 4-ех.

Неактивен

 

#6 08.02.2012 20:59:17

soln
Участник
Зарегистрирован: 07.02.2012
Сообщений: 3

Re: Оптимизировавший запрос вместо цикла?

vasya написал:

Дурной тон  hmm
В данном случае это действие производит база. И для базы это большие затраты, даже в лучшем случае ей ещё предупреждения писать (а если ещё учесть что работа базы и так, как правило, самое узкое место...). Кроме того работа вашего скрипта становится зависимой от настроек базы.

Спасибо за  Ваши советы.
Вас понял поправлю. Как с текучкой разберусь.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson